diff --git a/.travis.yml b/.travis.yml index 104bb1d00c2..548a8c53380 100644 --- a/.travis.yml +++ b/.travis.yml @@ -93,8 +93,8 @@ script: - php upgrade.php 3.5.0 3.6.0 >> upgrade.log - php upgrade2.php 3.5.0 3.6.0 >> upgrade2.log - php upgrade.php 3.6.0 3.7.0 >> upgrade.log - - php upgrade2.php 3.6.0 3.7.0 >> upgrade2.log # - cat upgrade.log + - php upgrade2.php 3.6.0 3.7.0 >> upgrade2.log # - cat upgrade2.log - cd ../.. - date diff --git a/COPYRIGHT b/COPYRIGHT index 78b9bee6d18..c0d8389369c 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -19,9 +19,9 @@ FPDF_TPL 1.2 Apache Software License 2.0 Yes GeoIP 1.4 LGPL-2.1+ Yes Sample code to make geoip convert (not into deb package) NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package) odtPHP 1.0.1 GPL-2+ b Yes Library to build/edit ODT files -PHPExcel 1.7.6 LGPL-2.1+ Yes Read/Write XLS files, read ODS files +PHPExcel 1.7.8 LGPL-2.1+ Yes Read/Write XLS files, read ODS files PHPPrintIPP 1.3 GPL-2+ Yes Library to send print IPP requests -TCPDF 6.0.021 LGPL-3+ Yes PDF generation +TCPDF 6.0.093 LGPL-3+ Yes PDF generation JS libraries: jQuery 1.8.2 MIT License Yes JS library diff --git a/ChangeLog b/ChangeLog index 7d22836f5e6..977ac4123ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ English Dolibarr ChangeLog ***** ChangeLog for 3.7 compared to 3.6.* ***** For users: +- New: Can filter on status on interventions. +- New: Add help info of field type into dictionary of payment types. +- New: Add proposals into referer page of thirdparty. - New: On contact list can set filter on both active and not active (no more exclusive select). - New: Each user can include its own external ics calendar into dolibarr agenda view. - New: Intervention documents are now available in ECM module. @@ -45,6 +48,8 @@ For users: - New: Enable supplier price log table - New: [ task #1204 ] add a External reference to contract - New: [ task #1218 ] Can drag and drop an event from calendar to change its day. +- New: Optimize size of image static resources. +- Upgrade phpexcel lib to 1.7.8 - Fix: [ bug #1487 ] PAYMENT_DELETE trigger does not intercept trigger action - Fix: [ bug #1470, #1472, #1473] User trigger problem - Fix: [ bug #1489, #1491 ] Intervention trigger problem @@ -63,11 +68,15 @@ For users: - Fix: [ bug #1469 ] Triggers CONTACT_MODIFY and CONTACT_DELETE duplicates error message - Fix: [ bug #1537 ] Difference between societe.nom and adherent.societe. +New experimental module: +- New: Module Accounting Expert to manage accountancy + For translators: - Update language files. - New: When a translation is not available we always jump to en_US and only en_US. For developers: +- New: Add a css style "cursorpointer". - New: Select list of users can return user into hierarchy. - New: getBrowserInfo can return type of layout of browser (classic/phone/tablet) - New: Add hook "searchAgendaFrom". @@ -80,6 +89,9 @@ For developers: - New: Added hook "formConfirm" and "doActions" for supplier invoice card - New: [ task #1511, #1426 ] Added hook "doActions" for supplier card and supplier order card - New: renamed table llx_c_pays to llx_c_country & libelle field to label +- Qual: Renamed table llx_c_civilite into llx_c_civility + field civilite into label in the same table + and field civilite into civility in other table WARNING: Following change may create regression for some external modules, but was necessary to make Dolibarr better: @@ -87,9 +99,25 @@ Dolibarr better: - Changed the way parameters are provided to scripts sync_xxx_ldap2dolibarr.php - Some field into database wwere renamed from "libelle" to "label". - Table llx_c_pays were renamed into llx_c_country. -- Trigger PROJECT_BUILDDOC is removed. Building a doc is not a business event. For action after - creation of a pdf, hook "afterPDFCreation" must be used instead. +- Triggers *_BUILDDOC are removed. Building a doc is not a business event. For action after + creation of a pdf or odt, hook "afterPDFCreation" or "afterODTCreation" must be used instead. + +***** ChangeLog for 3.6.1 compared to 3.6.* ***** +For users: +- Fix: Can upload files on services. +- Fix: sql errors on updat fichinter. +- Fix: debian script syntax error. +- Fix: error "menu param is not inside list" into pos module. +- Fix: Salary payments are not reflected on the reporting sheets. +- Fix: Unsubscribe emailing not working. +- Fix: Trigger on create category call failed because user is not passed on card. +- Fix: list event view lost type event filter. +- Fix: Save also code event. +- Fix: VAT payment - Add control on field date value. +- Fix: Salaries payment - Field date value is now required and add control on it. +- Fix: Iban was used instead of Bic into SEPA file. +- Fix: Must unaccent strings into SEPA file. ***** ChangeLog for 3.6 compared to 3.5.* ***** For users: @@ -221,9 +249,11 @@ Fix: Link product, In list view and label product. Fix: visible task into area "time" for "My task" must limit task to tasks i am assigned to. Fix: When disabled, all fields to add time into task line must be disabled. Fix: Missing include files.lib.php in some pages that use dol_delete_recursive -Fix: Missing include files.lib.php in some pages ti use dol_delete_recursive. Fix: [ bug #1558 ] Product/service edit page title shows new Ref instead of old ref. Fix: [ bug #1553 ] Saving User displays setup removes menu. +Fix: [ bug #1544 ] Can remove date from invoice +Fix: list event view lost type event filter +Fix: Add code save on create event ***** ChangeLog for 3.5.4 compared to 3.5.3 ***** Fix: Hide title of event when agenda module disabled. diff --git a/build/debian/README.howto b/build/debian/README.howto index d0bdd4574f4..5c0f9d7d0a4 100644 --- a/build/debian/README.howto +++ b/build/debian/README.howto @@ -153,7 +153,9 @@ from origin/upstream and origin/pristine. * Into root dir, launch: > debian/get-orig-source.sh -If script fails with error Bad certificate, you can set "export PERL_LWP_SSL_VERIFY_HOSTNAME=0 " to solve this. +If script fails with error Bad certificate, you can set "export PERL_LWP_SSL_VERIFY_HOSTNAME=0" to solve this. + +* Some files are removed from archive by the get-orig-source.sh * Staying into git root directory, run > git-import-orig -vv ../tcpdf_x.y.z+dfsg.orig.tar.xz @@ -161,8 +163,8 @@ If script fails with error Bad certificate, you can set "export PERL_LWP_SSL_VER Note: If there was errors solved manually, you may need to make a git commit * Add an entry into debian/changelog -> dch -v x.y.z-dsfg-1 "My comment" will add entry. -For example: dch -v x.y.z-dsfg-1 "New upstream release." for a new version +> dch -v x.y.z+dfsg-1 "My comment" will add entry. +For example: dch -v x.y.z+dfsg-1 "New upstream release." for a new version Then modify changelog to replace "version" or "unstable" with "UNRELEASED". Warning: Date must have format reported by "date -R" @@ -229,27 +231,28 @@ from origin/upstream and origin/pristine. * If new upstream is available onto sourceforge, launch: > debian/get-orig-source.sh -If script fails with error Bad certificate, you can set "export PERL_LWP_SSL_VERIFY_HOSTNAME=0 " to solve this. +If script fails with error Bad certificate, you can set "export PERL_LWP_SSL_VERIFY_HOSTNAME=0" to solve this. * Edit tgz file to remove -- ckeditor -- phpexcel -- tcpdf +- htdocs/includes/ckeditor +- htdocs/includes/jquery/plugins/datatables/extras/TableTools/swf +- htdocs/includes/phpexcel +- htdocs/includes/tcpdf And rename file into -dolibarr-x.y.z+dsfgw.tgz -(x.y.z = version, w start from 1 and is increased for each new import) +dolibarr-x.y.z+dfsgw.tgz +(x.y.z = version, w start from 1 and is increased for each new git-import-orig already done) * Staying into git root directory, run -> git-import-orig -vv ../dolibarr-x.y.z+dsfgw.tgz +> git-import-orig -vv ../dolibarr-x.y.z+dfsgw.tgz and enter version when requested with format -x.y.z+dsfgw +x.y.z+dfsgw (x.y.z = version, w start from 1 and is increased for each new import) Note: If there was errors solved manually after get-orig-sources.sh, you may need to make a git commit * Add an entry into debian/changelog -> dch -v x.y.z-w "My comment" will add entry. -For example: dch -v x.y.z-w "New upstream release." for a new version (x.y.z = version, w start from 1 and increaed for each new import) +> dch -v x.y.z+dfsg-w "My comment" will add entry. +For example: dch -v x.y.z+dfsg-w "New upstream release." for a new version (x.y.z = version, w start from 1 and increaed for each new import) Then modify changelog to replace "version" or "unstable" with "UNRELEASED". Then check/modify also the user/date signature: - Date must have format reported by "date -R" diff --git a/build/debian/dolibarr.postinst b/build/debian/dolibarr.postinst index 0f99f53203b..8a6078af377 100644 --- a/build/debian/dolibarr.postinst +++ b/build/debian/dolibarr.postinst @@ -129,7 +129,7 @@ case "$1" in then # Create an empty conf.php with permission to web server setup_empty_conf - else + #else # File already exist. We add params not found. #echo Add new params to overwrite path to use shared libraries/fonts #grep -q -c "dolibarr_lib_ADODB_PATH" $config || [ ! -d "/usr/share/php/adodb" ] || echo "" >> $config diff --git a/build/debian/get-orig-source.sh b/build/debian/get-orig-source.sh index 57f87ab1999..821a639a470 100755 --- a/build/debian/get-orig-source.sh +++ b/build/debian/get-orig-source.sh @@ -1,23 +1,46 @@ #!/bin/sh -# Scan for new official sources and download file -# run with debian/get-orig-source.sh [x.y.z] tmpdir=$(mktemp -d) -echo "tmpdir = $tmpdir" + +# Download source file if [ -n "$1" ]; then uscan_opts="--download-version=$1" fi -uscan --noconf --force-download --no-symlink --verbose --destdir=$tmpdir $uscan_opts +#uscan --noconf --force-download --no-symlink --destdir=$tmpdir $uscan_opts cd $tmpdir -tgzfile=$(echo *.tgz) -version=$(echo "$tgzfile" | perl -pi -e 's/^dolibarr-//; s/\.tgz$//; s/_/./g; s/\+nmu1//; ') +# Other method to download (comment uscan if you use this) +wget http://sourceforge.net/projects/tcpdf/files/tcpdf_6_0_093.zip + +# Rename file to add +dfsg +zipfile=$(echo *.zip) +version=$(echo "$zipfile" | perl -pi -e 's/^tcpdf_//; s/\.zip$//; s/_/./g; s/$/+dfsg/;') + +# Extract the zip file +unzip -q $zipfile +srcdir=$(find . -maxdepth 1 -mindepth 1 -type d | sed -e 's/\.\///') + +if [ ! -d "$srcdir" ]; then + echo "ERROR: Failed to identify the extracted directory in $tmpdir (got $srcdir)" >&2 + rm -rf $tmpdir + exit 1 +fi + +# Cleanup unwanted files +rm -rf $srcdir/fonts/free* + +# Repack as tar.xz +tar Jcf tcpdf_${version}.orig.tar.xz $srcdir cd - >/dev/null -mv $tmpdir/dolibarr-${version}.tgz ../ -echo "File ../dolibarr-${version}.tgz is ready for git-import" +if [ -e ../tcpdf_${version}.orig.tar.xz ]; then + echo "Not overwriting ../tcpdf_${version}.orig.tar.xz"; +else + echo "Created ../tcpdf_${version}.orig.tar.xz" + mv $tmpdir/tcpdf_${version}.orig.tar.xz ../ +fi rm -rf $tmpdir diff --git a/build/exe/doliwamp/doliwamp.iss b/build/exe/doliwamp/doliwamp.iss index 0037e091973..da727786896 100644 --- a/build/exe/doliwamp/doliwamp.iss +++ b/build/exe/doliwamp/doliwamp.iss @@ -32,7 +32,7 @@ AppPublisherURL=http://www.nltechno.com AppSupportURL=http://www.dolibarr.org AppUpdatesURL=http://www.dolibarr.org AppComments=DoliWamp includes Dolibarr, Apache, PHP and Mysql softwares. -AppCopyright=Copyright (C) 2008-2013 Laurent Destailleur, NLTechno +AppCopyright=Copyright (C) 2008-2014 Laurent Destailleur, NLTechno DefaultDirName=c:\dolibarr DefaultGroupName=Dolibarr ;LicenseFile=COPYING diff --git a/build/makepack-dolibarrlang.pl b/build/makepack-dolibarrlang.pl deleted file mode 100755 index 6066a678d7c..00000000000 --- a/build/makepack-dolibarrlang.pl +++ /dev/null @@ -1,300 +0,0 @@ -#!/usr/bin/perl -#---------------------------------------------------------------------------- -# \file build/makepack-dolibarrlang.pl -# \brief Package builder (tgz, zip, rpm, deb, exe) -# \author (c)2005 Laurent Destailleur -#---------------------------------------------------------------------------- - -use Cwd; - -$PROJECT = "dolibarr"; - -@LISTETARGET = ("TGZ"); # Possible packages -%REQUIREMENTTARGET = ( # Tool requirement for each package - "TGZ" => "tar", - "ZIP" => "7z", - "EXE" => "makensis.exe" -); -%ALTERNATEPATH = ( - "7z" => "7-ZIP", - "makensis.exe" => "NSIS" -); - -use vars qw/ $REVISION $VERSION /; -$REVISION = '1.10'; -$VERSION = "1.0 (build $REVISION)"; - -#------------------------------------------------------------------------------ -# MAIN -#------------------------------------------------------------------------------ -( $DIR = $0 ) =~ s/([^\/\\]+)$//; -( $PROG = $1 ) =~ s/\.([^\.]*)$//; -$Extension = $1; -$DIR ||= '.'; -$DIR =~ s/([^\/\\])[\\\/]+$/$1/; - -# Detect OS type -# -------------- -if ( "$^O" =~ /linux/i || ( -d "/etc" && -d "/var" && "$^O" !~ /cygwin/i ) ) { - $OS = 'linux'; - $CR = ''; -} -elsif ( -d "/etc" && -d "/Users" ) { $OS = 'macosx'; $CR = ''; } -elsif ( "$^O" =~ /cygwin/i || "$^O" =~ /win32/i ) { - $OS = 'windows'; - $CR = "\r"; -} -if ( !$OS ) { - print "$PROG.$Extension was not able to detect your OS.\n"; - print "Can't continue.\n"; - print "$PROG.$Extension aborted.\n"; - sleep 2; - exit 1; -} - -# Define buildroot -# ---------------- -if ( $OS =~ /linux/ ) { - $TEMP = $ENV{"TEMP"} || $ENV{"TMP"} || "/tmp"; -} -if ( $OS =~ /macos/ ) { - $TEMP = $ENV{"TEMP"} || $ENV{"TMP"} || "/tmp"; -} -if ( $OS =~ /windows/ ) { - $TEMP = $ENV{"TEMP"} || $ENV{"TMP"} || "c:/temp"; - $PROGPATH = $ENV{"ProgramFiles"}; -} -if ( !$TEMP || !-d $TEMP ) { - print "Error: A temporary directory can not be find.\n"; - print "Check that TEMP or TMP environment variable is set correctly.\n"; - print "makepack-dolibarrlang.pl aborted.\n"; - sleep 2; - exit 2; -} -$BUILDROOT = "$TEMP/dolibarr-buildroot"; - -my $copyalreadydone = 0; -my $batch = 0; - -print "Makepack langs version $VERSION\n"; -print "Enter language code to package (en_US, fr_FR, ...) : "; -$PROJECT = ; -chomp($PROJECT); - -# Ask and set version $MAJOR and $MINOR -print "Enter value for version: "; -$PROJVERSION = ; -chomp($PROJVERSION); -( $MAJOR, $MINOR ) = split( /\./, $PROJVERSION, 2 ); -if ( $MINOR eq '' ) { - print "Enter value for minor version: "; - $MINOR = ; - chomp($MINOR); -} - -$FILENAME = "$PROJECT"; -$FILENAMETGZ = "lang_$PROJECT-$MAJOR.$MINOR"; -if ( -d "/usr/src/redhat" ) { - - # redhat - $RPMDIR = "/usr/src/redhat"; -} -if ( -d "/usr/src/RPM" ) { - - # mandrake - $RPMDIR = "/usr/src/RPM"; -} - -$SOURCE = "$DIR/../../dolibarr"; -$DESTI = "$SOURCE/build"; - -# Choose package targets -#----------------------- -$target = "ZIP"; # Les langs sont au format zip -if ($target) { - $CHOOSEDTARGET{ uc($target) } = 1; -} -else { - my $found = 0; - my $NUM_SCRIPT; - while ( !$found ) { - my $cpt = 0; - printf( " %d - %3s (%s)\n", - $cpt, "All", "Need " . join( ",", values %REQUIREMENTTARGET ) ); - foreach my $target (@LISTETARGET) { - $cpt++; - printf( " %d - %3s (%s)\n", - $cpt, $target, "Need " . $REQUIREMENTTARGET{$target} ); - } - - # Are asked to select the file to move - print "Choose one package number or several separated with space: "; - $NUM_SCRIPT = ; - chomp($NUM_SCRIPT); - if ( $NUM_SCRIPT =~ s/-//g ) { - - # Do not do copy - $copyalreadydone = 1; - } - if ( $NUM_SCRIPT !~ /^[0-$cpt\s]+$/ ) { - print "This is not a valid package number list.\n"; - $found = 0; - } - else { - $found = 1; - } - } - print "\n"; - if ($NUM_SCRIPT) { - foreach my $num ( split( /\s+/, $NUM_SCRIPT ) ) { - $CHOOSEDTARGET{ $LISTETARGET[ $num - 1 ] } = 1; - } - } - else { - foreach my $key (@LISTETARGET) { - $CHOOSEDTARGET{$key} = 1; - } - } -} - -# Test if requirement is ok -#-------------------------- -foreach my $target ( keys %CHOOSEDTARGET ) { - foreach my $req ( split( /[,\s]/, $REQUIREMENTTARGET{$target} ) ) { - - # Test - print "Test requirement for target $target: Search '$req'... "; - $ret = `"$req" 2>&1`; - $coderetour = $?; - $coderetour2 = $coderetour >> 8; - if ( - $coderetour != 0 - && ( ( $coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i ) - || ( $coderetour2 == 127 && $OS !~ /windows/ ) ) - && $PROGPATH - ) - { - - # Not found error, we try in PROGPATH - $ret = `"$PROGPATH/$ALTERNATEPATH{$req}/$req\" 2>&1`; - $coderetour = $?; - $coderetour2 = $coderetour >> 8; - $REQUIREMENTTARGET{$target} = "$PROGPATH/$ALTERNATEPATH{$req}/$req"; - } - - if ( - $coderetour != 0 - && ( ( $coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i ) - || ( $coderetour2 == 127 && $OS !~ /windows/ ) ) - ) - { - - # Not found error - print -"Not found\nCan't build target $target. Requirement '$req' not found in PATH\n"; - $CHOOSEDTARGET{$target} = -1; - last; - } - else { - - # Pas erreur ou erreur autre que programme absent - print " Found " . $REQUIREMENTTARGET{$target} . "\n"; - } - } -} - -print "\n"; - -# Check if there is at least on target to build -#---------------------------------------------- -$nboftargetok = 0; -foreach my $target ( keys %CHOOSEDTARGET ) { - if ( $CHOOSEDTARGET{$target} < 0 ) { next; } - $nboftargetok++; -} - -if ($nboftargetok) { - - # Update buildroot - #----------------- - if ( !$copyalreadydone ) { - print "Delete directory $BUILDROOT\n"; - $ret = `rm -fr "$BUILDROOT"`; - mkdir "$BUILDROOT"; - mkdir "$BUILDROOT/htdocs"; - mkdir "$BUILDROOT/htdocs/langs"; - mkdir "$BUILDROOT/htdocs/langs/$PROJECT"; - - print "Copy $SOURCE into $BUILDROOT\n"; - mkdir "$BUILDROOT"; - $ret = - `cp -pr "$SOURCE/htdocs/langs/$PROJECT" "$BUILDROOT/htdocs/langs"`; - } - print "Clean $BUILDROOT\n"; - $ret = -`rm -fr $BUILDROOT/htdocs/langs/$PROJECT/Thumbs.db $BUILDROOT/htdocs/langs/$PROJECT/*/Thumbs.db $BUILDROOT/htdocs/langs/$PROJECT/*/*/Thumbs.db $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/Thumbs.db`; - $ret = -`rm -fr $BUILDROOT/htdocs/langs/$PROJECT/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/*/*/CVS*`; - - # Build package for each target - #------------------------------ - foreach my $target ( keys %CHOOSEDTARGET ) - { - if ( $CHOOSEDTARGET{$target} < 0 ) { next; } - - print "\nBuild package for target $target\n"; - - if ( $target eq 'TGZ' ) - { - unlink $FILENAMETGZ . tgz; - - # unlink $BUILDROOT/$FILENAMETGZ.tgz; - print "Compress $BUILDROOT/htdocs into $FILENAMETGZ.tgz...\n"; - $cmd = -"tar --exclude-vcs --exclude-from \"$DESTI/tgz/tar.exclude\" --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$FILENAMETGZ.tgz\" htdocs"; - $ret = `$cmd`; - -# $cmd="tar --exclude-vcs --exclude-from \"$DESTI/tgz/tar.exclude\" --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$BUILDROOT/$FILENAMETGZ.tgz\" htdocs\n"; -# $ret=`$cmd`; - if ( $OS =~ /windows/i ) { - print "Move $FILENAMETGZ.tgz to $DESTI/$FILENAMETGZ.tgz\n"; - $ret = `mv "$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`; - - # $ret=`mv "$BUILDROOT/$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`; - } - next; - } - - if ( $target eq 'ZIP' ) - { - unlink $FILENAMEZIP . zip; - print "Compress $FILENAMETGZ into $FILENAMEZIP.zip...\n"; - chdir("$BUILDROOT"); - -#print "cd $BUILDROOTNT & 7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip $FILENAMETGZ\\*.*\n"; -#$ret=`cd $BUILDROOTNT & 7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip $FILENAMETGZ\\*.*`; - $ret = - `7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip $FILENAMETGZ\\*.*`; - print "Move $FILENAMEZIP.zip to $DESTI\n"; - rename( "$BUILDROOT/$FILENAMEZIP.zip", "$DESTI/$FILENAMEZIP.zip" ); - next; - } - } -} - -print "\n----- Summary -----\n"; -foreach my $target ( keys %CHOOSEDTARGET ) { - if ( $CHOOSEDTARGET{$target} < 0 ) { - print "Package $target not built (bad requirement).\n"; - } - else { - print "Package $target built succeessfully in $DESTI\n"; - } -} - -if ( !$btach ) { - print "\nPress key to finish..."; - my $WAITKEY = ; -} - -0; diff --git a/dev/codesniffer/ruleset.xml b/dev/codesniffer/ruleset.xml index 6b498e7d167..72590c15741 100755 --- a/dev/codesniffer/ruleset.xml +++ b/dev/codesniffer/ruleset.xml @@ -243,6 +243,10 @@ + + + 0 + 0 @@ -253,13 +257,13 @@ 0 + 0 0 - diff --git a/dev/optimize_images.sh b/dev/optimize_images.sh new file mode 100755 index 00000000000..616eec75757 --- /dev/null +++ b/dev/optimize_images.sh @@ -0,0 +1,195 @@ +#!/bin/bash +# Borrowed from https://gist.github.com/lgiraudel/6065155 +# Inplace mode added by Raphaël Doursenaud + +PROGNAME=${0##*/} +INPUT='' +QUIET='0' +NOSTATS='0' +INPLACE='0' +max_input_size=0 +max_output_size=0 + +usage() +{ + cat </dev/null + rm -fr $2.firstpass + fi + if [ "${1##*.}" = "jpg" -o "${1##*.}" = "jpeg" ]; then + jpegtran -copy none -progressive $1 > $2 + fi + + output_file_size=$(stat -c%s "$2") + max_output_size=$(expr $max_output_size + $output_file_size) +} + +get_max_file_length() +{ + local maxlength=0 + + IMAGES=$(find $INPUT -regextype posix-extended -regex '.*\.(jpg|jpeg|png)' | grep -v $OUTPUT) + + for CURRENT_IMAGE in $IMAGES; do + filename=$(basename "$CURRENT_IMAGE") + if [[ ${#filename} -gt $maxlength ]]; then + maxlength=${#filename} + fi + done + + echo "$maxlength" +} + +main() +{ + # If $INPUT is empty, then we use current directory + if [[ "$INPUT" == "" ]]; then + INPUT=$(pwd) + fi + + # If $OUTPUT is empty, then we use the directory "output" in the current directory + if [[ "$OUTPUT" == "" ]]; then + OUTPUT=$(pwd)/output + fi + # If inplace, we use /tmp for output + if [[ "$INPLACE" == "1" ]]; then + OUTPUT='/tmp/optimize' + fi + + # We create the output directory + mkdir -p $OUTPUT + + # To avoid some troubles with filename with spaces, we store the current IFS (Internal File Separator)... + SAVEIFS=$IFS + # ...and we set a new one + IFS=$(echo -en "\n\b") + + max_filelength=`get_max_file_length` + pad=$(printf '%0.1s' "."{1..600}) + sDone=' [ DONE ]' + linelength=$(expr $max_filelength + ${#sDone} + 5) + + # Search of all jpg/jpeg/png in $INPUT + # We remove images from $OUTPUT if $OUTPUT is a subdirectory of $INPUT + IMAGES=$(find $INPUT -regextype posix-extended -regex '.*\.(jpg|jpeg|png)' | grep -v $OUTPUT) + + if [ "$QUIET" == "0" ]; then + echo --- Optimizing $INPUT --- + echo + fi + for CURRENT_IMAGE in $IMAGES; do + filename=$(basename $CURRENT_IMAGE) + if [ "$QUIET" == "0" ]; then + printf '%s ' "$filename" + printf '%*.*s' 0 $((linelength - ${#filename} - ${#sDone} )) "$pad" + fi + + optimize_image $CURRENT_IMAGE $OUTPUT/$filename + + # Replace file + if [[ "$INPLACE" == "1" ]]; then + mv $OUTPUT/$filename $CURRENT_IMAGE + fi + + if [ "$QUIET" == "0" ]; then + printf '%s\n' "$sDone" + fi + done + + # Cleanup + if [[ "$INPLACE" == "1" ]]; then + rm -rf $OUTPUT + fi + + # we restore the saved IFS + IFS=$SAVEIFS + + if [ "$NOSTATS" == "0" -a "$QUIET" == "0" ]; then + echo + echo "Input: " $(human_readable_filesize $max_input_size) + echo "Output: " $(human_readable_filesize $max_output_size) + space_saved=$(expr $max_input_size - $max_output_size) + echo "Space save: " $(human_readable_filesize $space_saved) + fi +} + +human_readable_filesize() +{ +echo -n $1 | awk 'function human(x) { + s=" b Kb Mb Gb Tb" + while (x>=1024 && length(s)>1) + {x/=1024; s=substr(s,4)} + s=substr(s,1,4) + xf=(s==" b ")?"%5d ":"%.2f" + return sprintf( xf"%s", x, s) + } + {gsub(/^[0-9]+/, human($1)); print}' +} + +SHORTOPTS="h,i:,o:,q,s,p" +LONGOPTS="help,input:,output:,quiet,no-stats,inplace" +ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@") + +eval set -- "$ARGS" +while true; do + case $1 in + -h|--help) + usage + exit 0 + ;; + -i|--input) + shift + INPUT=$1 + ;; + -o|--output) + shift + OUTPUT=$1 + ;; + -q|--quiet) + QUIET='1' + ;; + -s|--no-stats) + NOSTATS='1' + ;; + -p|--inplace) + INPLACE='1' + ;; + --) + shift + break + ;; + *) + shift + break + ;; + esac + shift +done + +main + diff --git a/dev/skeletons/build_class_from_table.php b/dev/skeletons/build_class_from_table.php index 6acbc1feb35..0b2e96daaac 100755 --- a/dev/skeletons/build_class_from_table.php +++ b/dev/skeletons/build_class_from_table.php @@ -254,11 +254,11 @@ foreach($property as $key => $prop) $varprop.="\t\t\$sql.= \" "; if ($prop['istime']) { - $varprop.='".(! isset($this->'.$prop['field'].') || dol_strlen($this->'.$prop['field'].')==0?\'NULL\':$this->db->idate('; + $varprop.='".(! isset($this->'.$prop['field'].') || dol_strlen($this->'.$prop['field'].')==0?\'NULL\':"\'".$this->db->idate('; $varprop.="\$this->".$prop['field'].""; - $varprop.='))."'; + $varprop.=')."\'")."'; if ($i < count($property)) $varprop.=","; - $varprop.="\";"; + $varprop.='";'; } elseif ($prop['ischar']) { diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php new file mode 100644 index 00000000000..c42a8d7079b --- /dev/null +++ b/htdocs/accountancy/admin/account.php @@ -0,0 +1,209 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/admin/account.php + * \ingroup Accounting Expert + * \brief List accounting account + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; + +// Langs +$langs->load("compta"); +$langs->load("accountancy"); + +$mesg = ''; +$action = GETPOST('action'); +$id = GETPOST('id', 'int'); +$rowid = GETPOST('rowid', 'int'); + +// Security check +if (!$user->admin) + accessforbidden(); + +$sortfield = GETPOST("sortfield", 'alpha'); +$sortorder = GETPOST("sortorder", 'sortorder'); +$limit = $conf->liste_limit; +$page = GETPOST("page", 'int'); +if ($page == - 1) { + $page = 0; +} +$offset = $conf->liste_limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (! $sortfield) + $sortfield = "aa.account_number"; +if (! $sortorder) + $sortorder = "ASC"; + +if ($action == 'delete') { + $formconfirm = $html->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $id, $langs->trans('DeleteAccount'), $langs->trans('ConfirmDeleteAccount'), 'confirm_delete', '', 0, 1); + print $formconfirm; +} + +$accounting = new AccountingAccount($db); + +if ($action == 'disable') { + $accounting = $accounting->fetch($id); + if (! empty($accounting->id)) { + $result = $accounting->account_desactivate($id); + } + + $action = 'update'; + if ($result < 0) { + setEventMessage($accounting->error, 'errors'); + } +} else if ($action == 'enable') { + + $accounting = $accounting->fetch($id); + + if (! empty($accounting->id)) { + $result = $accounting->account_activate($id); + } + $action = 'update'; + if ($result < 0) { + setEventMessage($accounting->error, 'errors'); + } +} + +/* + * View + * + */ +llxHeader('', $langs->trans("ListAccounts")); + +$pcgver = $conf->global->CHARTOFACCOUNTS; + +$sql = "SELECT aa.rowid, aa.fk_pcg_version, aa.pcg_type, aa.pcg_subtype, aa.account_number, aa.account_parent , aa.label, aa.active "; +$sql .= " FROM " . MAIN_DB_PREFIX . "accountingaccount as aa, " . MAIN_DB_PREFIX . "accounting_system as asy"; +$sql .= " WHERE aa.fk_pcg_version = asy.pcg_version"; +$sql .= " AND asy.rowid = " . $pcgver; + +if (strlen(trim($_GET["search_account"]))) { + $sql .= " AND aa.account_number like '%" . $_GET["search_account"] . "%'"; +} +if (strlen(trim($_GET["search_label"]))) { + $sql .= " AND aa.label like '%" . $_GET["search_label"] . "%'"; +} +if (strlen(trim($_GET["search_accountparent"]))) { + $sql .= " AND aa.account_parent like '%" . $_GET["search_accountparent"] . "%'"; +} +if (strlen(trim($_GET["search_pcgtype"]))) { + $sql .= " AND aa.pcg_type like '%" . $_GET["search_pcgtype"] . "%'"; +} +if (strlen(trim($_GET["search_pcgsubtype"]))) { + $sql .= " AND aa.pcg_subtype like '%" . $_GET["search_pcgsubtype"] . "%'"; +} + +$sql .= $db->order($sortfield, $sortorder); +$sql .= $db->plimit($limit + 1, $offset); + +dol_syslog('accountancy/admin/account.php:: $sql=' . $sql); +$result = $db->query($sql); + +if ($result) { + $num = $db->num_rows($result); + + print_barre_liste($langs->trans('ListAccounts'), $page, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, '', $num); + + $i = 0; + + print '
'; + + print '
'; + + print '' . $langs->trans("Addanaccount") . ''; + print '' . $langs->trans("ImportAccount") . ''; + print '

'; + + print ''; + print ''; + print_liste_field_titre($langs->trans("AccountNumber"), "account.php", "aa.account_number", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Label"), "account.php", "aa.label", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Accountparent"), "account.php", "aa.account_parent", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Pcgtype"), "account.php", "aa.pcg_type", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Pcgsubtype"), "account.php", "aa.pcg_subtype", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Active"), "account.php", "aa.active", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre(" "); + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $var = True; + + while ( $i < min($num, $limit) ) { + $obj = $db->fetch_object($resql); + + $var = ! $var; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print '' . "\n"; + + print "\n"; + $i ++; + } + + print "
 '; + print ''; + print '
' . $obj->account_number . '' . $obj->label . '' . $obj->account_parent . '' . $obj->pcg_type . '' . $obj->pcg_subtype . ''; + if (empty($obj->active)) { + print ''; + print img_picto($langs->trans("Disabled"), 'switch_off'); + print ''; + } else { + print ''; + print img_picto($langs->trans("Activated"), 'switch_on'); + print ''; + } + print ''; + if ($user->admin) { + print ''; + print img_edit(); + print ' '; + print ''; + print img_delete(); + print ''; + } + print '
"; + print '
'; +} else { + dol_print_error($db); +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php new file mode 100644 index 00000000000..43dc38ea4bb --- /dev/null +++ b/htdocs/accountancy/admin/card.php @@ -0,0 +1,300 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/admin/card.php + * \ingroup Accounting Expert + * \brief Card accounting account + */ +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; + +// Langs +$langs->load("bills"); +$langs->load("accountancy"); + +$mesg = ''; +$action = GETPOST('action'); +$id = GETPOST('id', 'int'); +$rowid = GETPOST('rowid', 'int'); + +// Security check +if (!$user->admin) + accessforbidden(); + +$accounting = new AccountingAccount($db); + +// Action +if ($action == 'add') +{ + $sql = 'SELECT pcg_version FROM ' . MAIN_DB_PREFIX . 'accounting_system WHERE rowid=' . $conf->global->CHARTOFACCOUNTS; + + dol_syslog('accountancy/admin/card.php:: $sql=' . $sql); + $result = $db->query($sql); + $obj = $db->fetch_object($result); + + $accounting->fk_pcg_version = $obj->pcg_version; + $accounting->pcg_type = GETPOST('pcg_type'); + $accounting->pcg_subtype = GETPOST('pcg_subtype'); + $accounting->account_number = GETPOST('account_number', 'int'); + $accounting->account_parent = GETPOST('account_parent', 'int'); + $accounting->label = GETPOST('label', 'alpha'); + $accounting->active = 1; + + $res = $accounting->create($user); + + if ($res == 0) { + } else { + if ($res == - 3) { + $_error = 1; + $action = "create"; + } + if ($res == - 4) { + $_error = 2; + $action = "create"; + } + } + Header("Location: account.php"); +} +else if ($action == 'edit') +{ + if (! GETPOST('cancel', 'alpha')) { + $result = $accounting->fetch($id); + + $sql = 'SELECT pcg_version FROM ' . MAIN_DB_PREFIX . 'accounting_system WHERE rowid=' . $conf->global->CHARTOFACCOUNTS; + + dol_syslog('accountancy/admin/card.php:: $sql=' . $sql); + $result2 = $db->query($sql); + $obj = $db->fetch_object($result2); + + $accounting->fk_pcg_version = $obj->pcg_version; + $accounting->pcg_type = GETPOST('pcg_type'); + $accounting->pcg_subtype = GETPOST('pcg_subtype'); + $accounting->account_number = GETPOST('account_number', 'int'); + $accounting->account_parent = GETPOST('account_parent', 'int'); + $accounting->label = GETPOST('label', 'alpha'); + + $result = $accounting->update($user); + + if ($result > 0) { + header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id); + exit(); + } else { + $mesg = $object->error; + } + } else { + header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id); + exit(); + } +} +else if ($action == 'delete') +{ + $result = $accounting->fetch($id); + + if (! empty($accounting->id)) { + $result = $accounting->delete($user); + + if ($result > 0) { + Header("Location: account.php"); + } + } + + if ($result < 0) { + setEventMessage($accounting->error, 'errors'); + } +} + +/* + * View + * + */ +llxheader('', $langs->trans('AccountAccounting')); + +$form = new Form($db); +$htmlacc = new FormVentilation($db); + +if ($action == 'create') +{ + print_fiche_titre($langs->trans('NewAccount')); + + print '
' . "\n"; + print ''; + print ''; + + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print '
' . $langs->trans("AccountNumber") . '
' . $langs->trans("Label") . '
' . $langs->trans("Accountparent") . ''; + print $htmlacc->select_account($accounting->account_parent, 'account_parent'); + print '
' . $langs->trans("Pcgtype") . ''; + print $htmlacc->select_pcgtype($accounting->pcg_type, 'pcg_type'); + print '
' . $langs->trans("Pcgsubtype") . ''; + print $htmlacc->select_pcgsubtype($accounting->pcg_subtype, 'pcg_subtype'); + print '
'; + + print '
    '; + print ''; +} +else if ($id) +{ + $rowid = $id; + $account = $accounting->fetch($rowid); + + if ($account > 0) { + dol_htmloutput_mesg($mesg); + + $head = accounting_prepare_head($accounting); + + if ($action == 'update') + { + // WYSIWYG Editor + $htmlacc = new FormVentilation($db); + + require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; + + $soc = new Societe($db); + if ($object->socid) { + $soc->fetch($object->socid); + } + + dol_fiche_head($head, 'card', $langs->trans('AccountAccounting'), 0, 'billr'); + + print '' . "\n"; + print ''; + print ''; + print ''; + + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print '
' . $langs->trans("AccountNumber") . '
' . $langs->trans("Label") . '
' . $langs->trans("Accountparent") . ''; + print $htmlacc->select_account($accounting->account_parent, 'account_parent'); + print '
' . $langs->trans("Pcgtype") . ''; + print $htmlacc->select_pcgtype($accounting->pcg_type, 'pcg_type'); + print '
' . $langs->trans("Pcgsubtype") . ''; + print $htmlacc->select_pcgsubtype($accounting->pcg_subtype, 'pcg_subtype'); + print '
'; + + print '
  '; + print ''; + print '
'; + + print ''; + + print ''; + } + else + { + $linkback = '' . $langs->trans("BackToChartofaccounts") . ''; + + dol_fiche_head($head, 'card', $langs->trans('AccountAccounting'), 0, 'billr'); + + print ''; + + // Account number + print ''; + print ''; + print ''; + + print ''; + print ''; + + $accp = new AccountingAccount($db); + if (! empty($accounting->account_parent)) { + $accp->fetch($accounting->account_parent, ''); + } + print ''; + print ''; + + print ''; + print ''; + + print ''; + print ''; + + print ''; + print ''; + + print '
' . $langs->trans("AccountNumber") . '' . $accounting->account_number . '' . $linkback . '
' . $langs->trans("Label") . '' . $accounting->label . '
' . $langs->trans("Accountparent") . '' . $accp->account_number . ' - ' . $accp->label . '
' . $langs->trans("Pcgtype") . '' . $accounting->pcg_type . '
' . $langs->trans("Pcgsubtype") . '' . $accounting->pcg_subtype . '
' . $langs->trans("Active") . ''; + + if (empty($accounting->active)) { + print img_picto($langs->trans("Disabled"), 'switch_off'); + } else { + print img_picto($langs->trans("Activated"), 'switch_on'); + } + + print '
'; + + print ''; + + /* + * Barre d'actions + */ + + print '
'; + + if ($user->admin) { + print '' . $langs->trans('Modify') . ''; + } else { + print '' . $langs->trans('Modify') . ''; + } + + if ($user->admin) { + print '' . $langs->trans('Delete') . ''; + } else { + print '' . $langs->trans('Delete') . ''; + } + + print '
'; + } + } + else + { + dol_print_error($db); + } +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/admin/export.php b/htdocs/accountancy/admin/export.php new file mode 100644 index 00000000000..448ce32cb18 --- /dev/null +++ b/htdocs/accountancy/admin/export.php @@ -0,0 +1,165 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * Copyright (C) 2014 Marcos García + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/admin/export.php + * \ingroup Accounting Expert + * \brief Setup page to configure accounting expert module + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; + +$langs->load("compta"); +$langs->load("bills"); +$langs->load("admin"); +$langs->load("accountancy"); + +// Security check +if (!$user->admin) + accessforbidden(); + +$action = GETPOST('action', 'alpha'); + +// Other parameters ACCOUNTING_* +$list = array ( + 'ACCOUNTING_SEPARATORCSV' +); + +/* + * Actions + */ +if ($action == 'update') { + $error = 0; + + $modelcsv = GETPOST('modelcsv', 'int'); + + if (! empty($modelcsv)) { + + if (! dolibarr_set_const($db, 'ACCOUNTING_MODELCSV', $modelcsv, 'chaine', 0, '', $conf->entity)) { + $error ++; + } + } else { + $error ++; + } + + foreach ( $list as $constname ) { + $constvalue = GETPOST($constname, 'alpha'); + + if (! dolibarr_set_const($db, $constname, $constvalue, 'chaine', 0, '', $conf->entity)) { + $error ++; + } + } + + if (! $error) { + setEventMessage($langs->trans("SetupSaved")); + } else { + setEventMessage($langs->trans("Error"), 'errors'); + } +} + +/* + * View + */ + +llxHeader(); + +$form = new Form($db); + +print_fiche_titre($langs->trans('ConfigAccountingExpert')); + +$head = admin_accounting_prepare_head(null); + +dol_fiche_head($head, 'export', $langs->trans("Configuration"), 0, 'cron'); + +print '
'; +print ''; +print ''; + +print ''; +$var = True; + +print ''; +print ''; +print ''; + +$var = ! $var; + +print ''; +print ""; +print ""; +print "
' . $langs->trans("Modelcsv") . '
" . $langs->trans("Selectmodelcsv") . ""; +print '"; +print "
"; + +print "
\n"; + +/* + * Params + * + */ +$list = array ( + 'ACCOUNTING_SEPARATORCSV' +); + +$num = count($list); +if ($num) { + print ''; + print ''; + print ''; + print "\n"; +} + +foreach ( $list as $key ) { + $var = ! $var; + + print ''; + + // Param + $label = $langs->trans($key); + print ''; + + // Value + print ''; +} + +print ''; +print "
' . $langs->trans('OtherOptions') . '
' . $label . ''; + print ''; + print '
\n"; + +print '
'; + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/admin/fiscalyear.php b/htdocs/accountancy/admin/fiscalyear.php similarity index 92% rename from htdocs/admin/fiscalyear.php rename to htdocs/accountancy/admin/fiscalyear.php index dfb404b0b6b..5907c754644 100644 --- a/htdocs/admin/fiscalyear.php +++ b/htdocs/accountancy/admin/fiscalyear.php @@ -16,12 +16,12 @@ */ /** - * \file htdocs/admin/fiscalyear.php + * \file htdocs/accountancy/admin/fiscalyear.php * \ingroup fiscal year * \brief Setup page to configure fiscal year */ -require '../main.inc.php'; +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/fiscalyear.class.php'; @@ -55,6 +55,8 @@ $object = new Fiscalyear($db); * View */ +$max=100; + $form = new Form($db); llxHeader('',$title); @@ -68,16 +70,13 @@ $sql.= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear as f"; $sql.= " WHERE f.entity = ".$conf->entity; $result = $db->query($sql); - -$max=10; - if ($result) { $var=false; $num = $db->num_rows($result); $i = 0; - + // Load attribute_label print ''; print ''; @@ -85,13 +84,13 @@ if ($result) print ''; print ''; print ''; - print ''; + print ''; print ''; - + if ($num) { $fiscalyearstatic=new Fiscalyear($db); - + while ($i < $num && $i < $max) { $obj = $db->fetch_object($result); @@ -102,7 +101,7 @@ if ($result) print ''; print ''; print ''; - print ''; + print ''; print ''; $var=!$var; $i++; @@ -113,10 +112,9 @@ if ($result) { print ''; } - + print '
'.$langs->trans("Label").''.$langs->trans("DateStart").''.$langs->trans("DateEnd").''.$langs->trans("Statut").''.$langs->trans("Statut").'
'.$obj->label.''.dol_print_date($db->jdate($obj->date_start),'day').''.dol_print_date($db->jdate($obj->date_end),'day').''.$fiscalyearstatic->LibStatut($obj->statut,5).''.$fiscalyearstatic->LibStatut($obj->statut,5).'
'.$langs->trans("None").'
'; - print ''; -} +} else { dol_print_error($db); diff --git a/htdocs/admin/fiscalyear_card.php b/htdocs/accountancy/admin/fiscalyear_card.php similarity index 93% rename from htdocs/admin/fiscalyear_card.php rename to htdocs/accountancy/admin/fiscalyear_card.php index b30cf2a69fc..423ac88b490 100644 --- a/htdocs/admin/fiscalyear_card.php +++ b/htdocs/accountancy/admin/fiscalyear_card.php @@ -16,11 +16,11 @@ */ /** - * \file htdocs/admin/fiscalyear_card.php + * \file htdocs/accountancy/admin/fiscalyear_card.php * \brief Page to show a fiscal year */ -require '../main.inc.php'; +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fiscalyear.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/fiscalyear.class.php'; @@ -51,6 +51,7 @@ $object = new Fiscalyear($db); $date_start=dol_mktime(0,0,0,GETPOST('fiscalyearmonth','int'),GETPOST('fiscalyearday','int'),GETPOST('fiscalyearyear','int')); $date_end=dol_mktime(0,0,0,GETPOST('fiscalyearendmonth','int'),GETPOST('fiscalyearendday','int'),GETPOST('fiscalyearendyear','int')); + /* * Actions */ @@ -74,9 +75,7 @@ else if ($action == 'add') if (! GETPOST('cancel','alpha')) { $error=0; - - $db->begin(); - + $object->date_start = $date_start; $object->date_end = $date_end; $object->label = GETPOST('label','alpha'); @@ -96,21 +95,27 @@ else if ($action == 'add') if (! $error) { - $id = $object->create($user); + $db->begin(); + + $id = $object->create($user); if ($id > 0) { + $db->commit(); + header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id); exit; } else - { - setEventMessage($object->error, 'errors'); + { + $db->rollback(); + + setEventMessage($object->error, 'errors'); $action='create'; } } else - { + { $action='create'; } } @@ -127,7 +132,7 @@ else if ($action == 'update') if (! GETPOST('cancel','alpha')) { $result = $object->fetch($id); - + $object->date_start = empty($_POST["fiscalyear"])?'':$date_start; $object->date_end = empty($_POST["fiscalyearend"])?'':$date_end; $object->label = GETPOST('label','alpha'); @@ -175,7 +180,7 @@ if ($action == 'create') // Label print ''.$langs->trans("Label").''; - + // Date start print ''.$langs->trans("DateStart").''; print $form->select_date(($date_start?$date_start:''),'fiscalyear'); @@ -185,7 +190,7 @@ if ($action == 'create') print ''.$langs->trans("DateEnd").''; print $form->select_date(($date_end?$date_end:-1),'fiscalyearend'); print ''; - + // Statut print ''; print ''.$langs->trans("Statut").''; @@ -207,11 +212,11 @@ else if ($id) { $head = fiscalyear_prepare_head($object); - dol_fiche_head($head, 'card', $langs->trans("FiscalYearCard"), 0, 'cron'); - if ($action == 'edit') { - print '
' . "\n"; + dol_fiche_head($head, 'card', $langs->trans("FiscalYearCard"), 0, 'cron'); + + print '' . "\n"; print ''; print ''; print ''; @@ -223,12 +228,12 @@ else if ($id) print ''.$langs->trans("Ref").''; print $object->ref; print ''; - + // Label print ''.$langs->trans("Label").''; print ''; print ''; - + // Date start print ''.$langs->trans("DateStart").''; print $form->select_date($object->date_start?$object->date_start:-1,'fiscalyear'); @@ -238,7 +243,7 @@ else if ($id) print ''.$langs->trans("DateEnd").''; print $form->select_date($object->date_end?$object->date_end:-1,'fiscalyearend'); print ''; - + // Statut print ''.$langs->trans("Statut").''; print $form->selectarray('statut',$statut2label,$object->statut); @@ -252,7 +257,7 @@ else if ($id) print '
'; - print ''; + dol_fiche_end(); } else { @@ -264,18 +269,20 @@ else if ($id) print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id,$langs->trans("DeleteFiscalYear"),$langs->trans("ConfirmDeleteFiscalYear"),"confirm_delete"); } - - print ''; + + dol_fiche_head($head, 'card', $langs->trans("FiscalYearCard"), 0, 'cron'); + + print '
'; $linkback = ''.$langs->trans("BackToList").''; - + // Ref print ''; - + // Label print ''; - + // Date end print ''; - print "
'.$langs->trans("Ref").''; print $object->ref; print ''; print $linkback; print '
'; print $form->editfieldkey("Label",'label',$object->label,$object,$conf->global->MAIN_EDIT_ALSO_INLINE,'alpha:32'); @@ -289,7 +296,7 @@ else if ($id) print ''; print $form->editfieldval("Date",'date_start',$object->date_start,$object,$conf->global->MAIN_EDIT_ALSO_INLINE,'datepicker'); print '
'; print $form->editfieldkey("Date",'date_end',$object->date_end,$object,$conf->global->MAIN_EDIT_ALSO_INLINE,'datepicker'); @@ -300,9 +307,9 @@ else if ($id) // Statut print '
'.$langs->trans("Status").''.$object->getLibStatut(4).'

"; + print ""; - print ''; + dol_fiche_end(); /* * Barre d'actions @@ -311,9 +318,9 @@ else if ($id) print '
'; print ''.$langs->trans('Modify').''; - + print ''.$langs->trans('Delete').''; - + print '
'; } } diff --git a/htdocs/admin/fiscalyear_info.php b/htdocs/accountancy/admin/fiscalyear_info.php similarity index 94% rename from htdocs/admin/fiscalyear_info.php rename to htdocs/accountancy/admin/fiscalyear_info.php index c59d75c8376..b6fa546edff 100644 --- a/htdocs/admin/fiscalyear_info.php +++ b/htdocs/accountancy/admin/fiscalyear_info.php @@ -16,11 +16,11 @@ */ /** - * \file htdocs/admin/fiscalyear_card.php + * \file htdocs/accountancy/admin/fiscalyear_card.php * \brief Page to show info of a fiscal year */ -require '../main.inc.php'; +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fiscalyear.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; @@ -43,15 +43,15 @@ if ($id) $object = new Fiscalyear($db); $object->fetch($id); $object->info($id); - + $head = fiscalyear_prepare_head($object); - + dol_fiche_head($head, 'info', $langs->trans("FiscalYearCard"), 0, 'cron'); print '
'; dol_print_object_info($object); print '
'; - + print ''; } diff --git a/htdocs/accountancy/admin/importaccounts.php b/htdocs/accountancy/admin/importaccounts.php new file mode 100644 index 00000000000..4354cd90cc3 --- /dev/null +++ b/htdocs/accountancy/admin/importaccounts.php @@ -0,0 +1,186 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/admin/importaccounts.php + * \ingroup Accounting Expert + * \brief Page import accounting account + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; + +// langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("main"); +$langs->load("accountancy"); + +// Security check +if (!$user->admin) + accessforbidden(); + +llxHeader('', $langs->trans("ImportAccount")); + +$to_import = GETPOST("mesCasesCochees"); + +if ($_POST["action"] == 'import') { + print '
' . $langs->trans("Processing") . '...
'; + if (is_array($to_import) && count($to_import) > 0) { + print '
' . count($to_import) . ' ' . $langs->trans("SelectedLines") . '
'; + $sql = 'SELECT pcg_version FROM ' . MAIN_DB_PREFIX . 'accounting_system WHERE rowid=' . $conf->global->CHARTOFACCOUNTS; + + $result = $db->query($sql); + if ($result && ($db->num_rows($result) > 0)) { + + $obj = $db->fetch_object($result); + + $cpt = 0; + foreach ( $to_import as $maLigneCochee ) { + + $accounting = new AccountingAccount($db); + + $monLabel = GETPOST('intitule' . $maLigneCochee); + $monParentAccount = GETPOST('AccountParent' . $maLigneCochee); + $monType = GETPOST('pcgType' . $maLigneCochee); + $monSubType = GETPOST('pcgSubType' . $maLigneCochee); + + $accounting->fk_pcg_version = $obj->pcg_version; + $accounting->account_number = $maLigneCochee; + $accounting->label = $monLabel; + $accounting->account_parent = $monParentAccount; + $accounting->pcg_type = $monType; + $accounting->pcg_subtype = $monSubType; + $accounting->active = 1; + + $result = $accounting->create($user); + if ($result > 0) { + setEventMessage($langs->trans("AccountingAccountAdd"), 'mesgs'); + } else { + setEventMessage($accounting->error, 'errors'); + } + $cpt ++; + } + } else { + setEventMessage($langs->trans('AccountPlanNotFoundCheckSetting'), 'errors'); + } + } else { + print '
' . $langs->trans("AnyLineImport") . '
'; + } + print '
' . $langs->trans("EndProcessing") . '
'; +} + +/* +* list accounting account from product +* +*/ +$page = GETPOST("page"); +if ($page < 0) + $page = 0; +$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION; +$offset = $limit * $page; + +$sql = "(SELECT p.rowid as product_id, p.accountancy_code_sell as accounting "; +$sql .= " FROM " . MAIN_DB_PREFIX . "product as p "; +$sql .= " WHERE p.accountancy_code_sell >=0"; +$sql .= " GROUP BY accounting "; +$sql .= ")"; +$sql .= "UNION ALL(SELECT p.rowid as product_id, p.accountancy_code_buy as accounting "; +$sql .= " FROM " . MAIN_DB_PREFIX . "product as p "; +$sql .= " WHERE p.accountancy_code_buy >=0"; +$sql .= " GROUP BY accounting "; +$sql .= ") "; +$sql .= " ORDER BY accounting DESC " . $db->plimit($limit + 1, $offset); + +dol_syslog('accountancy/admin/importaccounts.php:: $sql=' . $sql); +$result = $db->query($sql); +if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + print_barre_liste($langs->trans("ImportAccount"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $form = new Form($db); + $htmlacc = new FormVentilation($db); + + print '' . "\n"; + print ''; + + $var = True; + while ( $i < min($num_lines, $limit) ) { + $objp = $db->fetch_object($result); + $var = ! $var; + print ""; + + print ''; + + print ''; + + // Colonne choix du compte + print ''; + + print ''; + + print ''; + + // Colonne choix ligne a ventiler + + $checked = ('intitule' == 'O') ? ' checked=checked' : ''; + + print ''; + + print ''; + $i ++; + } + + print ''; + + print '
' . $langs->trans("accountingaccount") . '' . $langs->trans("label") . '' . $langs->trans("Accountparent") . '' . $langs->trans("Pcgtype") . '' . $langs->trans("Pcgsubtype") . '' . $langs->trans("Import") . '
'; + print $objp->accounting; + print ''; + print ''; + print ''; + print $htmlacc->select_account($accounting->account_parent, 'AccountParent'); + print ''; + print $htmlacc->select_pcgtype($accounting->pcg_type, 'pcgType'); + print ''; + print $htmlacc->select_pcgsubtype($accounting->pcg_subtype, 'pcgSubType'); + print ''; + print ''; + print '
 
'; + print ''; +} else { + print $db->error(); +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/includes/phpexcel/PHPExcel/Shared/PDF/fonts/.noencode b/htdocs/accountancy/admin/index.html similarity index 100% rename from htdocs/includes/phpexcel/PHPExcel/Shared/PDF/fonts/.noencode rename to htdocs/accountancy/admin/index.html diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php new file mode 100644 index 00000000000..9abd2899af4 --- /dev/null +++ b/htdocs/accountancy/admin/index.php @@ -0,0 +1,292 @@ + + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Ari Elbaz (elarifr) + * Copyright (C) 2014 Marcos García + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/admin/index.php + * \ingroup Accounting Expert + * \brief Setup page to configure accounting expert module + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; + +$langs->load("compta"); +$langs->load("bills"); +$langs->load("admin"); +$langs->load("accountancy"); + +// Security check +if (!$user->admin) + accessforbidden(); + +$action = GETPOST('action', 'alpha'); + +// Other parameters COMPTA_* & ACCOUNTING_* +$list = array ( + 'ACCOUNTING_LIMIT_LIST_VENTILATION', + 'ACCOUNTING_LENGTH_GACCOUNT', + 'ACCOUNTING_LENGTH_AACCOUNT', + 'COMPTA_ACCOUNT_CUSTOMER', + 'COMPTA_ACCOUNT_SUPPLIER', + 'COMPTA_PRODUCT_BUY_ACCOUNT', + 'COMPTA_PRODUCT_SOLD_ACCOUNT', + 'COMPTA_SERVICE_BUY_ACCOUNT', + 'COMPTA_SERVICE_SOLD_ACCOUNT', + 'ACCOUNTING_ACCOUNT_SUSPENSE', + 'ACCOUNTING_ACCOUNT_TRANSFER_CASH' +); + +/* + * Actions + */ + +$compta_mode = defined('COMPTA_MODE')?COMPTA_MODE:'RECETTES-DEPENSES'; + +if ($action == 'update') +{ + $error = 0; + + $compta_modes = array( + 'RECETTES-DEPENSES', + 'CREANCES-DETTES' + ); + + $compta_mode = GETPOST('compta_mode','alpha'); + + if (in_array($compta_mode,$compta_modes)) { + + if (!dolibarr_set_const($db, 'COMPTA_MODE', $compta_mode, 'chaine', 0, '', $conf->entity)) { + $error++; + } + } else { + $error++; + } + + $chartofaccounts = GETPOST('chartofaccounts', 'int'); + + if (! empty($chartofaccounts)) { + + if (! dolibarr_set_const($db, 'CHARTOFACCOUNTS', $chartofaccounts, 'chaine', 0, '', $conf->entity)) { + $error ++; + } + } else { + $error ++; + } + + foreach ($list as $constname) { + $constvalue = GETPOST($constname, 'alpha'); + + if (!dolibarr_set_const($db, $constname, $constvalue, 'chaine', 0, '', $conf->entity)) { + $error++; + } + } + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } +} + +if ($action == 'setlistsorttodo') { + $setlistsorttodo = GETPOST('value', 'int'); + $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $setlistsorttodo, 'yesno', 0, '', $conf->entity); + if (! $res > 0) + $error ++; + + if (! $error) { + setEventMessage($langs->trans("SetupSaved"), 'mesgs'); + } else { + setEventMessage($langs->trans("Error"), 'mesgs'); + } +} + +if ($action == 'setlistsortdone') { + $setlistsortdone = GETPOST('value', 'int'); + $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_DONE", $setlistsortdone, 'yesno', 0, '', $conf->entity); + if (! $res > 0) + $error ++; + if (! $error) { + setEventMessage($langs->trans("SetupSaved"), 'mesgs'); + } else { + setEventMessage($langs->trans("Error"), 'mesgs'); + } +} + +/* + * View + */ + +llxHeader(); + +$form = new Form($db); + +print_fiche_titre($langs->trans('ConfigAccountingExpert')); + +$head = admin_accounting_prepare_head($accounting); + +dol_fiche_head($head, 'general', $langs->trans("Configuration"), 0, 'cron'); + +print '
'; +print ''; +print ''; + +print ''; + +// Cas du parametre COMPTA_MODE + +print ''; +print ''; +print "\n"; +print ''; +print '\n"; +print ''; +print '\n"; +print ''; + +print "
'.$langs->trans('OptionMode').''.$langs->trans('Description').'
'.$langs->trans('OptionModeTrue').''.nl2br($langs->trans('OptionModeTrueDesc')); +// Write info on way to count VAT +//if (! empty($conf->global->MAIN_MODULE_COMPTABILITE)) +//{ +// // print "
\n"; +// // print nl2br($langs->trans('OptionModeTrueInfoModuleComptabilite')); +//} +//else +//{ +// // print "
\n"; +// // print nl2br($langs->trans('OptionModeTrueInfoExpert')); +//} +print "
'.$langs->trans('OptionModeVirtual').''.nl2br($langs->trans('OptionModeVirtualDesc'))."
\n"; + +print "
\n"; + +/* + * Define Chart of accounts + */ +print ''; +$var = True; + +print ''; +print ''; +print "\n"; +$var = ! $var; +print ''; +print ""; +print ""; +print "
'; +print $langs->trans("Chartofaccounts") . '
" . $langs->trans("Selectchartofaccounts") . ""; +print '"; +print "
"; + +print "
\n"; + +/* + * Others params + */ +print ''; +print ''; +print ''; +print "\n"; + +foreach ($list as $key) +{ + $var=!$var; + + print ''; + + // Param + $label = $langs->trans($key); + print ''; + + // Value + print ''; +} + +$var = ! $var; +print ""; +print ''; +if (! empty($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO)) { + print ''; +} else { + print ''; +} +print ''; + +$var = ! $var; +print ""; +print ''; +if (! empty($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE)) { + print ''; +} else { + print ''; +} +print ''; + +print ''; +print "
' . $langs->trans('OtherOptions') . '
'; + print ''; + print '
' . $langs->trans("ACCOUNTING_LIST_SORT_VENTILATION_TODO") . ''; + print img_picto($langs->trans("Activated"), 'switch_on'); + print ''; + print img_picto($langs->trans("Disabled"), 'switch_off'); + print '
' . $langs->trans("ACCOUNTING_LIST_SORT_VENTILATION_DONE") . ''; + print img_picto($langs->trans("Activated"), 'switch_on'); + print ''; + print img_picto($langs->trans("Disabled"), 'switch_off'); + print '
\n"; + +print '

'; + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/admin/journaux.php b/htdocs/accountancy/admin/journaux.php new file mode 100644 index 00000000000..49938781ace --- /dev/null +++ b/htdocs/accountancy/admin/journaux.php @@ -0,0 +1,165 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * Copyright (C) 2014 Marcos García + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/admin/journaux.php + * \ingroup Accounting Expert + * \brief Setup page to configure accounting expert module + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; + +$langs->load("accountancy"); + +// Security check +if (!$user->admin) + accessforbidden(); + +$action = GETPOST('action', 'alpha'); + +// Other parameters ACCOUNTING_* +$list = array ( + 'ACCOUNTING_SELL_JOURNAL', + 'ACCOUNTING_PURCHASE_JOURNAL', + 'ACCOUNTING_SOCIAL_JOURNAL', + 'ACCOUNTING_CASH_JOURNAL', + 'ACCOUNTING_MISCELLANEOUS_JOURNAL' +); + +/* + * Actions + */ + +if ($action == 'update') { + $error = 0; + + foreach ( $list as $constname ) { + $constvalue = GETPOST($constname, 'alpha'); + + if (! dolibarr_set_const($db, $constname, $constvalue, 'chaine', 0, '', $conf->entity)) { + $error ++; + } + } + + if (! $error) { + setEventMessage($langs->trans("SetupSaved")); + } else { + setEventMessage($langs->trans("Error"), 'errors'); + } +} + +/* + * View + */ + +llxHeader(); + +$form = new Form($db); + +print_fiche_titre($langs->trans('ConfigAccountingExpert')); + +$head = admin_accounting_prepare_head(null); + +dol_fiche_head($head, 'journal', $langs->trans("Configuration"), 0, 'cron'); + +print '
'; +print ''; +print ''; + +print ''; +print ''; +print ''; +print "\n"; + +foreach ( $list as $key ) { + $var = ! $var; + + print ''; + + // Param + $label = $langs->trans($key); + print ''; + + // Value + print ''; +} + +print ''; +print "
' . $langs->trans('Journaux') . '
'; + print ''; + print '
\n"; + +print '
'; + +print '
'; + +// Bank account +$sql = "SELECT ba.rowid, ba.ref , ba.label, ba.bank , ba.account_number, ba.code_journal "; +$sql .= " FROM ".MAIN_DB_PREFIX."lx_bank_account as ba"; +$sql .= " WHERE ba.clos = 0" ; +$sql .= " ORDER BY label"; + +dol_syslog('accountancy/admin/journaux.php:: $sql='.$sql); + +$resql = $db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + $i = 0; + +} + +print ''; +print ''; +print ''; +print "\n"; + +$form2 = new Form($db); + +$account = new Account($db); +foreach ( $resql as $key ) { + $var = ! $var; + + print ''; + + // Param + $label = $langs->trans($key); + print ''; + + // Value + print ''; +} + +print '
' . $langs->trans('JournauxTresorerie') . '
'; + print ''; + print '
'; +print ''; + +print '
'; + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php new file mode 100644 index 00000000000..0b06a3d0daa --- /dev/null +++ b/htdocs/accountancy/admin/productaccount.php @@ -0,0 +1,147 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/admin/productaccount.php + * \ingroup Accounting Expert + * \brief Onglet de gestion de parametrages des ventilations + */ + +// Dolibarr environment +$res = @include ("../main.inc.php"); +if (! $res && file_exists("../main.inc.php")) + $res = @include ("../main.inc.php"); +if (! $res && file_exists("../../main.inc.php")) + $res = @include ("../../main.inc.php"); +if (! $res && file_exists("../../../main.inc.php")) + $res = @include ("../../../main.inc.php"); +if (! $res) + die("Include of main fails"); + + // Class +dol_include_once("/core/lib/report.lib.php"); +dol_include_once("/core/lib/date.lib.php"); +dol_include_once("/product/class/product.class.php"); + +$langs->load("companies"); +$langs->load("compta"); +$langs->load("main"); +$langs->load("accountancy"); + +// Security check +if (!$user->admin) + accessforbidden(); + +llxHeader('', $langs->trans("Accounts")); + +$form = new Form($db); + +print ''; + +print ' + '; + +$sql = "SELECT p.rowid, p.ref , p.label, p.description , p.accountancy_code_sell as codesell, p.accountancy_code_buy, p.tms, p.fk_product_type as product_type , p.tosell , p.tobuy "; +$sql .= " FROM " . MAIN_DB_PREFIX . "product as p"; +$sql .= " WHERE p.accountancy_code_sell IS NULL AND p.tosell = 1 OR p.accountancy_code_buy IS NULL AND p.tobuy = 1"; + +dol_syslog('accountancy/admin/productaccount.php:: $sql=' . $sql); +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + /* +* view +*/ + + print '

'; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $var = True; + + while ( $i < min($num, 250) ) { + $obj = $db->fetch_object($resql); + $var = ! $var; + + $compta_prodsell = $obj->accountancy_code_sell; + if (empty($compta_prodsell)) { + if ($obj->product_type == 0) + $compta_prodsell = (! empty($conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT) ? $conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); + else + $compta_prodsell = (! empty($conf->global->COMPTA_SERVICE_SOLD_ACCOUNT) ? $conf->global->COMPTA_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); + } + + $compta_prodbuy = $obj->accountancy_code_buy; + if (empty($compta_prodbuy)) { + if ($obj->product_type == 0) + $compta_prodbuy = (! empty($conf->global->COMPTA_PRODUCT_BUY_ACCOUNT) ? $conf->global->COMPTA_PRODUCT_BUY_ACCOUNT : $langs->trans("CodeNotDef")); + else + $compta_prodbuy = (! empty($conf->global->COMPTA_SERVICE_BUY_ACCOUNT) ? $conf->global->COMPTA_SERVICE_BUY_ACCOUNT : $langs->trans("CodeNotDef")); + } + + $product_static = new Product($db); + + print ""; + // Ref produit + $product_static->ref = $objp->ref; + $product_static->id = $objp->rowid; + $product_static->type = $objp->type; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + + print ''; + print ''; + + print "\n"; + $i ++; + } + print "
' . $langs->trans("Ref") . '' . $langs->trans("Label") . '' . $langs->trans("Description") . '' . $langs->trans("Accountancy_code_buy") . '' . $langs->trans("Accountancy_code_buy_suggest") . '' . $langs->trans("Accountancy_code_sell") . '' . $langs->trans("Accountancy_code_sell_suggest") . '
'; + if ($product_static->id) + print $product_static->getNomUrl(1); + else + print ' '; + print '' . $obj->ref . '' . $obj->label . '' . $obj->description . '' . $obj->accountancy_code_buy . '' . $compta_prodbuy . '' . $obj->accountancy_code_sell . '' . $compta_prodsell . '
"; + $db->free($resql); +} else { + dol_print_error($db); +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/bookkeeping/balancebymonth.php b/htdocs/accountancy/bookkeeping/balancebymonth.php new file mode 100644 index 00000000000..dd9f18e82a4 --- /dev/null +++ b/htdocs/accountancy/bookkeeping/balancebymonth.php @@ -0,0 +1,134 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/bookkeeping/balancebymonth.php + * \ingroup Accounting Expert + * \brief Balance by month + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; + +// Langs +$langs->load("main"); +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("accountancy"); + +// Filter +$year = $_GET["year"]; +if ($year == 0) { + $year_current = strftime("%Y", time()); + $year_start = $year_current; +} else { + $year_current = $year; + $year_start = $year; +} + +/* + * View + */ +llxHeader('', $langs->trans("CustomersVentilation")); + +$textprevyear = "" . img_previous() . ""; +$textnextyear = " " . img_next() . ""; + +print_fiche_titre($langs->trans("AccountBalanceByMonth") . ' ' . $textprevyear . ' ' . $langs->trans("Year") . ' ' . $year_start . ' ' . $textnextyear); + +$sql = "SELECT count(*) FROM " . MAIN_DB_PREFIX . "facturedet as fd"; +$sql .= " , " . MAIN_DB_PREFIX . "facture as f"; +$sql .= " WHERE fd.fk_code_ventilation = 0"; +$sql .= " AND f.rowid = fd.fk_facture AND f.fk_statut = 1;"; + +dol_syslog('accountancy/bookkeeping/balancebymonth.php:: $sql=' . $sql); +$result = $db->query($sql); +if ($result) { + $row = $db->fetch_row($result); + $nbfac = $row[0]; + + $db->free($result); +} + +$y = $year_current; + +$var = true; + +print ''; +print ''; + +$sql = "SELECT bk.numero_compte AS 'compte',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=1,bk.montant,0)),2) AS 'Janvier',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=2,bk.montant,0)),2) AS 'Fevrier',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=3,bk.montant,0)),2) AS 'Mars',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=4,bk.montant,0)),2) AS 'Avril',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=5,bk.montant,0)),2) AS 'Mai',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=6,bk.montant,0)),2) AS 'Juin',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=7,bk.montant,0)),2) AS 'Juillet',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=8,bk.montant,0)),2) AS 'Aout',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=9,bk.montant,0)),2) AS 'Septembre',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=10,bk.montant,0)),2) AS 'Octobre',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=11,bk.montant,0)),2) AS 'Novembre',"; +$sql .= " ROUND(SUM(IF(MONTH(bk.doc_date)=12,bk.montant,0)),2) AS 'Decembre',"; +$sql .= " ROUND(SUM(bk.montant),2) as 'Total'"; +$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as bk"; +$sql .= " WHERE bk.doc_date >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'"; +$sql .= " AND bk.doc_date <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'"; +$sql .= " GROUP BY bk.numero_compte"; + +$resql = $db->query($sql); +if ($resql) { + $i = 0; + $num = $db->num_rows($resql); + + while ( $i < $num ) { + + $row = $db->fetch_row($resql); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $i ++; + } + $db->free($resql); +} else { + print $db->lasterror(); +} +print "
' . $langs->trans("Intitule") . '' . $langs->trans("JanuaryMin") . '' . $langs->trans("FebruaryMin") . '' . $langs->trans("MarchMin") . '' . $langs->trans("AprilMin") . '' . $langs->trans("MayMin") . '' . $langs->trans("JuneMin") . '' . $langs->trans("JulyMin") . '' . $langs->trans("AugustMin") . '' . $langs->trans("SeptemberMin") . '' . $langs->trans("OctoberMin") . '' . $langs->trans("NovemberMin") . '' . $langs->trans("DecemberMin") . 'Total
' . length_accountg($row[0]) . '' . price($row[1]) . '' . price($row[2]) . '' . price($row[3]) . '' . price($row[4]) . '' . price($row[5]) . '' . price($row[6]) . '' . price($row[7]) . '' . price($row[8]) . '' . price($row[9]) . '' . price($row[10]) . '' . price($row[11]) . '' . price($row[12]) . '' . price($row[13]) . '
\n"; + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php new file mode 100644 index 00000000000..c782797b9cb --- /dev/null +++ b/htdocs/accountancy/bookkeeping/card.php @@ -0,0 +1,375 @@ + + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/bookkeeping/card.php + * \ingroup Accounting Expert + * \brief Page to show account + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'accountancy/class/bookkeeping.class.php'; + +// Langs +$langs->load("accounting"); + +// Security check +$id = GETPOST('id', 'int'); +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$action = GETPOST('action'); +$piece_num = GETPOST("piece_num"); + +$mesg = ''; + +$numero_compte = GETPOST('numero_compte'); +$code_tiers = GETPOST('code_tiers'); +$label_compte = GETPOST('label_compte'); +$debit = price2num(GETPOST('debit')); +$credit = price2num(GETPOST('credit')); + +if ($action == "confirm_update") { + + $error = 0; + + if ((intval($debit) != 0) && (intval($credit) != 0)) { + setEventMessage($langs->trans('ErrorDebitCredit'), 'errors'); + $error ++; + } + + if (empty($error)) { + $book = new BookKeeping($db); + + $result = $book->fetch($id); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } else { + $book->numero_compte = $numero_compte; + $book->code_tiers = $code_tiers; + $book->label_compte = $label_compte; + $book->debit = $debit; + $book->credit = $credit; + + if (! empty($debit)) { + $book->montant = $debit; + $book->sens = 'D'; + } + if (! empty($credit)) { + $book->montant = $credit; + $book->sens = 'C'; + } + + $result = $book->update(); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } else { + setEventMessage($langs->trans('Saved'), 'mesgs'); + $action = ''; + } + } + } +} + +else if ($action == "add") { + + $error = 0; + if ((intval($debit) != 0) && (intval($credit) != 0)) { + setEventMessage($langs->trans('ErrorDebitCredit'), 'errors'); + $error ++; + } + + if (empty($error)) { + $book = new BookKeeping($db); + + $book->numero_compte = $numero_compte; + $book->code_tiers = $code_tiers; + $book->label_compte = $label_compte; + $book->debit = $debit; + $book->credit = $credit; + $book->doc_date = GETPOST('doc_date'); + $book->doc_type = GETPOST('doc_type'); + $book->piece_num = $piece_num; + $book->doc_ref = GETPOST('doc_ref'); + $book->code_journal = GETPOST('code_journal'); + $book->fk_doc = GETPOST('fk_doc'); + $book->fk_docdet = GETPOST('fk_docdet'); + + if (! empty($debit)) { + $book->montant = $debit; + $book->sens = 'D'; + } + if (! empty($credit)) { + $book->montant = $credit; + $book->sens = 'C'; + } + + $result = $book->create_std($user); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } else { + setEventMessage($langs->trans('Saved'), 'mesgs'); + $action = ''; + } + } +} + +else if ($action == "confirm_delete") { + $book = new BookKeeping($db); + + $result = $book->fetch($id); + + $piece_num = $book->piece_num; + + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } else { + $result = $book->delete($user); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } + } + $action = ''; +} + +else if ($action == "confirm_create") { + $book = new BookKeeping($db); + + $book->label_compte = ''; + $book->debit = 0; + $book->credit = 0; + $book->doc_date = $date_start = dol_mktime(0, 0, 0, GETPOST('doc_datemonth'), GETPOST('doc_dateday'), GETPOST('doc_dateyear')); + $book->doc_type = GETPOST('doc_type'); + $book->piece_num = GETPOST('next_num_mvt'); + $book->doc_ref = GETPOST('doc_ref'); + $book->code_journal = GETPOST('code_journal'); + $book->fk_doc = 0; + $book->fk_docdet = 0; + + $book->montant = 0; + + $result = $book->create_std($user); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } else { + setEventMessage($langs->trans('Saved'), 'mesgs'); + $action = ''; + $piece_num = $book->piece_num; + } +} + +llxHeader(); + +$html = new Form($db); + +/* + * Confirmation to delete the command + */ +if ($action == 'delete') { + $formconfirm = $html->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $id, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt'), 'confirm_delete', '', 0, 1); + print $formconfirm; +} + +if ($action == 'create') { + + print_fiche_titre($langs->trans("CreateMvts")); + + $code_journal_array = array ( + $conf->global->ACCOUNTING_SELL_JOURNAL => $conf->global->ACCOUNTING_SELL_JOURNAL, + $conf->global->ACCOUNTING_PURCHASE_JOURNAL => $conf->global->ACCOUNTING_PURCHASE_JOURNAL, + $conf->global->ACCOUNTING_BANK_JOURNAL => $conf->global->ACCOUNTING_BANK_JOURNAL, + $conf->global->ACCOUNTING_SOCIAL_JOURNAL => $conf->global->ACCOUNTING_SOCIAL_JOURNAL + ); + + $book = new BookKeeping($db); + $next_num_mvt = $book->getNextNumMvt(); + + print '
'; + print '' . "\n"; + print '' . "\n"; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
' . $langs->trans("NumMvts") . '' . $next_num_mvt . '
' . $langs->trans("Docdate") . ''; + print $html->select_date('', 'doc_date', '', '', '', "create_mvt", 1, 1); + print '
' . $langs->trans("Codejournal") . '' . $html->selectarray('code_journal', $code_journal_array) . '
' . $langs->trans("Docref") . '
' . $langs->trans("Doctype") . '
'; + print '
'; + print ''; + + print '
'; +} else { + $book = new BookKeeping($db); + $result = $book->fetch_per_mvt($piece_num); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } + if (! empty($book->piece_num)) { + + print_fiche_titre($langs->trans("UpdateMvts")); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
' . $langs->trans("NumMvts") . '' . $book->piece_num . '
' . $langs->trans("Docdate") . '' . dol_print_date($book->doc_date, 'daytextshort') . '
' . $langs->trans("Codejournal") . '' . $book->code_journal . '
' . $langs->trans("Docref") . '' . $book->doc_ref . '
' . $langs->trans("Doctype") . '' . $book->doc_type . '
'; + + $result = $book->fetch_all_per_mvt($piece_num); + if ($result < 0) { + setEventMessage($book->errors, 'errors'); + } else { + + print_fiche_titre($langs->trans("ListeMvts")); + print ""; + if (count($book->linesmvt) > 0) { + + print ''; + + print_liste_field_titre($langs->trans("Numerocompte")); + print_liste_field_titre($langs->trans("Code_tiers")); + print_liste_field_titre($langs->trans("Labelcompte")); + print_liste_field_titre($langs->trans("Debit")); + print_liste_field_titre($langs->trans("Credit")); + print_liste_field_titre($langs->trans("Amount")); + print_liste_field_titre($langs->trans("Sens")); + + print ''; + print "\n"; + + foreach ( $book->linesmvt as $line ) { + $var = ! $var; + print ""; + + if ($action == 'update' && $line->id == $id) { + + print ''; + print '' . "\n"; + print '' . "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + } else { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + } + print "\n"; + } + + if ($action == "" || $action == 'add') { + $var = ! $var; + print ""; + + print ''; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + } + + print "
' . $line->montant . '' . $line->sens . ''; + if ($user->rights->accounting->access) { + print ''; + } + print ''; + print '' . $line->numero_compte . '' . $line->code_tiers . '' . $line->label_compte . '' . $line->debit . '' . $line->credit . '' . $line->montant . '' . $line->sens . ''; + if ($user->rights->accouting->access) { + print ''; + print img_edit(); + print ' '; + print ''; + print img_delete(); + print ''; + } + print '
"; + } + } + } else { + print_fiche_titre($langs->trans("NoRecords")); + } +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/bookkeeping/index.html b/htdocs/accountancy/bookkeeping/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php new file mode 100644 index 00000000000..12cf9559d8d --- /dev/null +++ b/htdocs/accountancy/bookkeeping/list.php @@ -0,0 +1,218 @@ + + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/bookkeeping/list.php + * \ingroup Accounting Expert + * \brief List operation of book keeping + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; + + +$page = GETPOST("page"); +$sortorder = GETPOST("sortorder"); +$sortfield = GETPOST("sortfield"); +$action = GETPOST('action', 'alpha'); + +if ($sortorder == "") + $sortorder = "ASC"; +if ($sortfield == "") + $sortfield = "bk.rowid"; + +$offset = $conf->liste_limit * $page; + +$formventilation = new FormVentilation($db); + +/* + * Action + */ +if ($action == 'delbookkeeping') { + + $import_key = GETPOST('importkey', 'alpha'); + + if (! empty($import_key)) { + $object = new BookKeeping($db); + $result = $object->delete_by_importkey($import_key); + Header("Location: list.php"); + if ($result < 0) { + setEventMessage($object->errors, 'errors'); + } + } +} // export csv +else if ($action == 'export_csv') { + + header('Content-Type: text/csv'); + header('Content-Disposition: attachment;filename=export_csv.csv'); + + $object = new BookKeeping($db); + $result = $object->export_bookkeping('ebp'); + if ($result < 0) { + setEventMessage($object->errors, 'errors'); + } + + foreach ( $object->linesexport as $line ) { + print $line->id . ','; + print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",'; + print '"' . $line->code_journal . '",'; + print '"' . $line->numero_compte . '",'; + print '"' . substr($line->code_journal, 0, 2) . '",'; + print '"' . substr($line->doc_ref, 0, 40) . '",'; + print '"' . $line->num_piece . '",'; + print '"' . $line->montant . '",'; + print '"' . $line->sens . '",'; + print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",'; + print '"' . $conf->currency . '",'; + print "\n"; + } +} + +else { + + llxHeader('', $langs->trans("Accounting") . ' - ' . $langs->trans("Bookkeeping")); + + /* + * List + */ + + $sql = "SELECT bk.rowid, bk.doc_date, bk.doc_type, bk.doc_ref, bk.code_tiers, bk.numero_compte , bk.label_compte, bk.debit , bk.credit, bk.montant , bk.sens , bk.code_journal , bk.piece_num "; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as bk"; + + if (dol_strlen(trim(GETPOST("search_doc_type")))) { + + $sql .= " WHERE bk.doc_type LIKE '%" . GETPOST("search_doc_type") . "%'"; + + if (dol_strlen(trim(GETPOST("search_doc_ref")))) { + $sql .= " AND bk.doc_ref LIKE '%" . GETPOST("search_doc_ref") . "%'"; + } + } + if (dol_strlen(trim(GETPOST("search_doc_ref")))) { + $sql .= " WHERE bk.doc_ref LIKE '%" . GETPOST("search_doc_ref") . "%'"; + } + if (dol_strlen(trim(GETPOST("search_compte")))) { + $sql .= " WHERE bk.numero_compte LIKE '%" . GETPOST("search_compte") . "%'"; + } + if (dol_strlen(trim(GETPOST("search_tiers")))) { + $sql .= " WHERE bk.code_tiers LIKE '%" . GETPOST("search_tiers") . "%'"; + } + if (dol_strlen(trim(GETPOST("search_journal")))) { + $sql .= " WHERE bk.code_journal LIKE '%" . GETPOST("search_journal") . "%'"; + } + + $sql .= " ORDER BY $sortfield $sortorder " . $db->plimit($conf->liste_limit + 1, $offset); + + dol_syslog('accountancy/bookkeeping/list.php:: $sql=' . $sql); + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + print_barre_liste($langs->trans("Bookkeeping"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num); + + print ''; + print ''; + print ''; + + print $formventilation->select_bookkeeping_importkey('importkey', GETPOST('importkey')); + + print '
'; + + print ''; + + print '' . $langs->trans("NewAccountingMvt") . ''; + + print '
'; + print ''; + print ''; + print ''; + print '
'; + + print ""; + print ''; + print_liste_field_titre($langs->trans("Doctype"), $_SERVER['PHP_SELF'], "bk.doc_type", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Docdate"), $_SERVER['PHP_SELF'], "bk.doc_date", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Docref"), $_SERVER['PHP_SELF'], "bk.doc_ref", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Numerocompte"), $_SERVER['PHP_SELF'], "bk.numero_compte", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Code_tiers"), $_SERVER['PHP_SELF'], "bk.code_tiers", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Labelcompte"), $_SERVER['PHP_SELF'], "bk_label_compte", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Debit"), $_SERVER['PHP_SELF'], "bk.debit", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Credit"), $_SERVER['PHP_SELF'], "bk.credit", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Amount"), $_SERVER['PHP_SELF'], "bk.montant", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Sens"), $_SERVER['PHP_SELF'], "bk.sens", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Codejournal"), $_SERVER['PHP_SELF'], "bk.code_journal", "", "", "", $sortfield, $sortorder); + print_liste_field_titre(" "); + print "\n"; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $var = True; + + while ( $i < min($num, $conf->liste_limit) ) { + $obj = $db->fetch_object($resql); + $var = ! $var; + + print ""; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + $i ++; + } + print "
      '; + print ''; + print '
' . $obj->doc_type . '' . dol_print_date($db->jdate($obj->doc_date), 'day') . '' . $obj->doc_ref . '' . length_accountg($obj->numero_compte) . '' . length_accounta($obj->code_tiers) . '' . $obj->label_compte . '' . price($obj->debit) . '' . price($obj->credit) . '' . price($obj->montant) . '' . $obj->sens . '' . $obj->code_journal . '' . img_edit() . '
"; + $db->free($resql); + } else { + dol_print_error($db); + } +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/bookkeeping/listbyyear.php b/htdocs/accountancy/bookkeeping/listbyyear.php new file mode 100644 index 00000000000..0829f792130 --- /dev/null +++ b/htdocs/accountancy/bookkeeping/listbyyear.php @@ -0,0 +1,128 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/bookkeeping/listbyyear.php + * \ingroup Accounting Expert + * \brief Book keeping by year + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; + +// Langs +$langs->load("accountancy"); + +$page = GETPOST("page"); +$sortorder = GETPOST("sortorder"); +$sortfield = GETPOST("sortfield"); + +// Filter +$year = GETPOST("year", 'int'); +if ($year == 0) { + $year_current = strftime("%Y", time()); + $year_start = $year_current; +} else { + $year_current = $year; + $year_start = $year; +} + +if ($sortorder == "") + $sortorder = "ASC"; +if ($sortfield == "") + $sortfield = "bk.rowid"; + +$offset = $conf->liste_limit * $page; + +llxHeader('', $langs->trans("Bookkeeping")); + +$textprevyear = "" . img_previous() . ""; +$textnextyear = " " . img_next() . ""; + +/* + * Mode Liste + * + */ + +$sql = "SELECT bk.rowid, bk.doc_date, bk.doc_type, bk.doc_ref, bk.code_tiers, bk.numero_compte , bk.label_compte, bk.debit , bk.credit, bk.montant , bk.sens, bk.code_journal"; +$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as bk"; +// $sql .= " WHERE bk.doc_date >= '".$db->idate(dol_get_first_day($y,1,false))."'"; +// $sql .= " AND bk.doc_date <= '".$db->idate(dol_get_last_day($y,12,false))."'"; +$sql .= " ORDER BY $sortfield $sortorder " . $db->plimit($conf->liste_limit + 1, $offset); + +dol_syslog('accountancy/bookkeeping/listbyyear.php:: $sql=' . $sql); +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + print_barre_liste($langs->trans("Bookkeeping") . " $textprevyear " . $langs->trans("Year") . " $year_start $textnextyear", $page, $_SERVER['PHP_SELF'], "", $sortfield, $sortorder, '', $num); + print ""; + + print ''; + print_liste_field_titre($langs->trans("Doctype"), $_SERVER['PHP_SELF'], "bk.doc_type", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Date"), $_SERVER['PHP_SELF'], "bk.doc_date", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Docref"), $_SERVER['PHP_SELF'], "bk.doc_ref", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("AccountAccounting"), $_SERVER['PHP_SELF'], "bk.numero_compte", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("ThirdPartyAccount"), $_SERVER['PHP_SELF'], "bk.code_tiers", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Label"), $_SERVER['PHP_SELF'], "bk_label_compte", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Debit"), $_SERVER['PHP_SELF'], "bk.debit", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Credit"), $_SERVER['PHP_SELF'], "bk.credit", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Amount"), $_SERVER['PHP_SELF'], "bk.montant", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Sens"), $_SERVER['PHP_SELF'], "bk.sens", "", "", "", $sortfield, $sortorder); + print_liste_field_titre($langs->trans("Codejournal"), $_SERVER['PHP_SELF'], "bk.code_journal", "", "", "", $sortfield, $sortorder); + print_liste_field_titre(" "); + print "\n"; + + $var = True; + + while ( $i < min($num, $conf->liste_limit) ) { + $obj = $db->fetch_object($resql); + $var = ! $var; + + print ""; + + print '' . "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + $i ++; + } + print "
' . $obj->doc_type . '' . dol_print_date($db->jdate($obj->doc_date)) . '' . $obj->doc_ref . '' . length_accountg($obj->numero_compte) . '' . length_accounta($obj->code_tiers) . '' . $obj->label_compte . '' . price($obj->debit) . '' . price($obj->credit) . '' . price($obj->montant) . '' . $obj->sens . '' . $obj->code_journal . '' . img_edit() . '
"; + $db->free($resql); +} else { + dol_print_error($db); +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/class/accountancyaccount.class.php b/htdocs/accountancy/class/accountancyaccount.class.php deleted file mode 100644 index 229bc79ba41..00000000000 --- a/htdocs/accountancy/class/accountancyaccount.class.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/accountancy/class/accountancyaccount.class.php - * \ingroup accounting - * \brief Fichier de la classe des comptes comptables - */ - - -/** - * \class AccountancyAccount - * \brief Classe permettant la gestion des comptes - */ -class AccountancyAccount -{ - var $db; - var $error; - - var $rowid; - var $fk_pcg_version; - var $pcg_type; - var $pcg_subtype; - var $label; - var $account_number; - var $account_parent; - - - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - function __construct($db) - { - $this->db = $db; - } - - - /** - * Insert account into database - * - * @param User $user User making add - * @return int <0 if KO, Id line added if OK - */ - function create($user) - { - $now=dol_now(); - - $sql = "INSERT INTO ".MAIN_DB_PREFIX."accountingaccount"; - $sql.= " (date_creation, fk_user_author, numero,intitule)"; - $sql.= " VALUES ('".$this->db->idate($now)."',".$user->id.",'".$this->numero."','".$this->intitule."')"; - - $resql = $this->db->query($sql); - if ($resql) - { - $id = $this->db->last_insert_id(MAIN_DB_PREFIX."accountingaccount"); - - if ($id > 0) - { - $this->id = $id; - $result = $this->id; - } - else - { - $result = -2; - $this->error="AccountancyAccount::Create Erreur $result"; - dol_syslog($this->error, LOG_ERR); - } - } - else - { - $result = -1; - $this->error="AccountancyAccount::Create Erreur $result"; - dol_syslog($this->error, LOG_ERR); - } - - return $result; - } - -} diff --git a/htdocs/accountancy/class/accountancysystem.class.php b/htdocs/accountancy/class/accountancysystem.class.php index 4d81a94985b..070f9a8071a 100644 --- a/htdocs/accountancy/class/accountancysystem.class.php +++ b/htdocs/accountancy/class/accountancysystem.class.php @@ -1,5 +1,7 @@ +/* Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,20 +18,18 @@ */ /** - * \file htdocs/accountancy/class/accountancysystem.class.php - * \ingroup accounting - * \brief File of class to manage accountancy systems + * \file htdocs/accountancy/class/accountancysystem.class.php + * \ingroup Accounting Expert + * \brief File of class to manage accountancy systems */ - -/** \class AccountancySystem - * \brief Classe to manage accountancy systems +/** + * Class to manage accountancy systems */ class AccountancySystem { var $db; var $error; - var $rowid; var $fk_pcg_version; var $pcg_type; @@ -38,57 +38,47 @@ class AccountancySystem var $account_number; var $account_parent; - /** - * Constructor + * Constructor * - * @param DoliDB $db Database handler + * @param DoliDB $db handler */ - function __construct($db) - { + function __construct($db) { $this->db = $db; } - /** - * Insert accountancy system name into database + * Insert accountancy system name into database * - * @param User $user User making insert - * @return int <0 if KO, Id of line if OK + * @param User $user making insert + * @return int if KO, Id of line if OK */ - function create($user) - { - $now=dol_now(); + function create($user) { + $now = dol_now(); - $sql = "INSERT INTO ".MAIN_DB_PREFIX."accounting_system"; - $sql.= " (date_creation, fk_user_author, numero,intitule)"; - $sql.= " VALUES ('".$this->db->idate($now)."',".$user->id.",'".$this->numero."','".$this->intitule."')"; + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "accounting_system"; + $sql .= " (date_creation, fk_user_author, numero,intitule)"; + $sql .= " VALUES (" . $this->db->idate($now) . "," . $user->id . ",'" . $this->numero . "','" . $this->intitule . "')"; + dol_syslog(get_class($this) . "::create sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); - if ($resql) - { - $id = $this->db->last_insert_id(MAIN_DB_PREFIX."accounting_system"); + if ($resql) { + $id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accounting_system"); - if ($id > 0) - { + if ($id > 0) { $this->id = $id; $result = $this->id; - } - else - { - $result = -2; - $this->error="AccountancySystem::Create Erreur $result"; + } else { + $result = - 2; + $this->error = "AccountancySystem::Create Erreur $result"; dol_syslog($this->error, LOG_ERR); } - } - else - { - $result = -1; - $this->error="AccountancySystem::Create Erreur $result"; + } else { + $result = - 1; + $this->error = "AccountancySystem::Create Erreur $result"; dol_syslog($this->error, LOG_ERR); } return $result; } - -} +} \ No newline at end of file diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php new file mode 100644 index 00000000000..6e0d16c6d6b --- /dev/null +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -0,0 +1,429 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/class/Accountingaccount.class.php + * \ingroup Accounting Expert + * \brief Fichier de la classe des comptes comptable + */ + +/** + * Classe permettant la gestion des comptes generaux de compta + */ +class AccountingAccount +{ + var $db; + var $id; + var $rowid; + var $datec; // Creation date + var $fk_pcg_version; + var $pcg_type; + var $pcg_subtype; + var $account_number; + var $account_parent; + var $label; + var $fk_user_author; + var $fk_user_modif; + var $active; + + /** + * Constructor + * + * @param DoliDB $db Database handle + */ + function __construct($db) + + { + $this->db = $db; + } + + /** + * Load record in memory + * + * @param int $rowid Id + * @param string $account_number Account number + * @return int <0 if KO, >0 if OK + */ + function fetch($rowid = null, $account_number = null) + { + if ($rowid || $account_number) { + $sql = "SELECT * FROM " . MAIN_DB_PREFIX . "accountingaccount WHERE "; + if ($rowid) { + $sql .= " rowid = '" . $rowid . "'"; + } elseif ($account_number) { + $sql .= " account_number = '" . $account_number . "'"; + } + + dol_syslog(get_class($this) . "::fetch sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $obj = $this->db->fetch_object($result); + } else { + return null; + } + } + + $this->id = $obj->rowid; + $this->rowid = $obj->rowid; + $this->datec = $obj->datec; + $this->tms = $obj->tms; + $this->fk_pcg_version = $obj->fk_pcg_version; + $this->pcg_type = $obj->pcg_type; + $this->pcg_subtype = $obj->pcg_subtype; + $this->account_number = $obj->account_number; + $this->account_parent = $obj->account_parent; + $this->label = $obj->label; + $this->fk_user_author = $obj->fk_user_author; + $this->fk_user_modif = $obj->fk_user_modif; + $this->active = $obj->active; + + return $obj->rowid; + } + + /** + * Insert line in accountingaccount + * + * @param User $user Use making action + * @param int $notrigger Disable triggers + * @return int <0 if KO, >0 if OK + */ + function create($user, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + // Clean parameters + if (isset($this->fk_pcg_version)) + $this->fk_pcg_version = trim($this->fk_pcg_version); + if (isset($this->pcg_type)) + $this->pcg_type = trim($this->pcg_type); + if (isset($this->pcg_subtype)) + $this->pcg_subtype = trim($this->pcg_subtype); + if (isset($this->account_number)) + $this->account_number = trim($this->account_number); + if (isset($this->account_parent)) + $this->account_parent = trim($this->account_parent); + if (isset($this->label)) + $this->label = trim($this->label); + if (isset($this->fk_user_author)) + $this->fk_user_author = trim($this->fk_user_author); + if (isset($this->active)) + $this->active = trim($this->active); + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "accountingaccount("; + + $sql .= "datec"; + $sql .= ", entity"; + $sql .= ", fk_pcg_version"; + $sql .= ", pcg_type"; + $sql .= ", pcg_subtype"; + $sql .= ", account_number"; + $sql .= ", account_parent"; + $sql .= ", label"; + $sql .= ", fk_user_author"; + $sql .= ", active"; + + $sql .= ") VALUES ("; + + $sql .= " '" . $this->db->idate($now) . "'"; + $sql .= ", " . $conf->entity; + $sql .= ", " . (! isset($this->fk_pcg_version) ? 'NULL' : "'" . $this->db->escape($this->fk_pcg_version) . "'"); + $sql .= ", " . (! isset($this->pcg_type) ? 'NULL' : "'" . $this->db->escape($this->pcg_type) . "'"); + $sql .= ", " . (! isset($this->pcg_subtype) ? 'NULL' : "'" . $this->pcg_subtype . "'"); + $sql .= ", " . (! isset($this->account_number) ? 'NULL' : "'" . $this->account_number . "'"); + $sql .= ", " . (! isset($this->account_parent) ? 'NULL' : "'" . $this->db->escape($this->account_parent) . "'"); + $sql .= ", " . (! isset($this->label) ? 'NULL' : "'" . $this->db->escape($this->label) . "'"); + $sql .= ", " . $user->id; + $sql .= ", " . (! isset($this->active) ? 'NULL' : "'" . $this->db->escape($this->active) . "'"); + + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this) . "::create sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + + if (! $error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accountingaccount"); + + if (! $notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + // // Call triggers + // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + // $interface=new Interfaces($this->db); + // $result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf); + // if ($result < 0) { $error++; $this->errors=$interface->errors; } + // // End call triggers + } + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::create " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } else { + $this->db->commit(); + return $this->id; + } + } + + /** + * Update record + * + * @param User $user Use making update + * @return int <0 if KO, >0 if OK + */ + function update($user) + { + global $langs; + + $this->db->begin(); + + $sql = "UPDATE " . MAIN_DB_PREFIX . "accountingaccount "; + $sql .= " SET fk_pcg_version = " . ($this->fk_pcg_version ? "'" . $this->db->escape($this->fk_pcg_version) . "'" : "null"); + $sql .= " , pcg_type = " . ($this->pcg_type ? "'" . $this->db->escape($this->pcg_type) . "'" : "null"); + $sql .= " , pcg_subtype = " . ($this->pcg_subtype ? "'" . $this->db->escape($this->pcg_subtype) . "'" : "null"); + $sql .= " , account_number = '" . $this->account_number . "'"; + $sql .= " , account_parent = '" . $this->account_parent . "'"; + $sql .= " , label = " . ($this->label ? "'" . $this->db->escape($this->label) . "'" : "null"); + $sql .= " , fk_user_modif = " . $user->id; + $sql .= " , active = '" . $this->active . "'"; + + $sql .= " WHERE rowid = " . $this->id; + + dol_syslog(get_class($this) . "::update sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $this->db->commit(); + return 1; + } else { + $this->error = $this->db->lasterror(); + $this->db->rollback(); + return - 1; + } + } + + /** + * Check usage of accounting code + * + * @return int <0 if KO, >0 if OK + */ + function checkUsage() + { + global $langs; + + $sql = "(SELECT fk_code_ventilation FROM " . MAIN_DB_PREFIX . "facturedet"; + $sql .= " WHERE fk_code_ventilation=" . $this->id . ")"; + $sql .= "UNION"; + $sql .= "(SELECT fk_code_ventilation FROM " . MAIN_DB_PREFIX . "facture_fourn_det"; + $sql .= " WHERE fk_code_ventilation=" . $this->id . ")"; + + dol_syslog(get_class($this) . "::checkUsage sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + + if ($resql) { + $num = $this->db->num_rows($resql); + if ($num > 0) { + $this->error = $langs->trans('ErrorAccountancyCodeIsAlreadyUse'); + return 0; + } else { + return 1; + } + } else { + $this->error = $this->db->lasterror(); + return - 1; + } + } + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param int $notrigger 0=triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + function delete($user, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + $result = $this->checkUsage(); + + if ($result > 0) { + + $this->db->begin(); + + if (! $error) { + if (! $notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + // // Call triggers + // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + // $interface=new Interfaces($this->db); + // $result=$interface->run_triggers('ACCOUNTANCY_ACCOUNT_DELETE',$this,$user,$langs,$conf); + // if ($result < 0) { $error++; $this->errors=$interface->errors; } + // // End call triggers + } + } + + if (! $error) { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . "accountingaccount"; + $sql .= " WHERE rowid=" . $this->id; + + dol_syslog(get_class($this) . "::delete sql=" . $sql); + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } else { + $this->db->commit(); + return 1; + } + } else { + return - 1; + } + } + + /** + * Information on record + * + * @param int $id of record + * @return void + */ + function info($id) + { + $sql = 'SELECT a.rowid, a.datec, a.fk_user_author, a.fk_user_modif, a.tms'; + $sql .= ' FROM ' . MAIN_DB_PREFIX . 'accountingaccount as a'; + $sql .= ' WHERE a.rowid = ' . $id; + + dol_syslog(get_class($this) . '::info sql=' . $sql); + $result = $this->db->query($sql); + + if ($result) { + if ($this->db->num_rows($result)) { + $obj = $this->db->fetch_object($result); + $this->id = $obj->rowid; + if ($obj->fk_user_author) { + $cuser = new User($this->db); + $cuser->fetch($obj->fk_user_author); + $this->user_creation = $cuser; + } + if ($obj->fk_user_modif) { + $muser = new User($this->db); + $muser->fetch($obj->fk_user_modif); + $this->user_modification = $muser; + } + $this->date_creation = $this->db->jdate($obj->datec); + $this->date_modification = $this->db->jdate($obj->tms); + } + $this->db->free($result); + } else { + dol_print_error($this->db); + } + } + + /** + * Account desactivate + * + * @param int $id Id + * @return int <0 if KO, >0 if OK + */ + function account_desactivate($id) + { + global $langs; + + $result = $this->checkUsage(); + + if ($result > 0) { + $this->db->begin(); + + $sql = "UPDATE " . MAIN_DB_PREFIX . "accountingaccount "; + $sql .= "SET active = '0'"; + $sql .= " WHERE rowid = ".$this->db->escape($id); + + dol_syslog(get_class($this) . "::desactivate sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + + if ($result) { + $this->db->commit(); + return 1; + } else { + $this->error = $this->db->lasterror(); + $this->db->rollback(); + return - 1; + } + } else { + return - 1; + } + } + + /** + * Account activate + * + * @param int $id Id + * @return int <0 if KO, >0 if OK + */ + function account_activate($id) + { + global $langs; + + $this->db->begin(); + + $sql = "UPDATE " . MAIN_DB_PREFIX . "accountingaccount "; + $sql .= "SET active = '1'"; + $sql .= " WHERE rowid = ".$this->db->escape($id); + + dol_syslog(get_class($this) . "::activate sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $this->db->commit(); + return 1; + } else { + $this->error = $this->db->lasterror(); + $this->db->rollback(); + return - 1; + } + } +} \ No newline at end of file diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php new file mode 100644 index 00000000000..2788526de05 --- /dev/null +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -0,0 +1,712 @@ + + * Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/class/bookkeeping.class.php + * \ingroup Accounting Expert + * \brief File of class to manage book keeping + */ + +/** + * Class to manage accountancy book keeping + */ +class BookKeeping +{ + var $db; + var $id; + var $doc_date; + var $doc_type; + var $doc_ref; + var $date_create; + var $fk_doc; + var $fk_docdet; + var $code_tiers; + var $numero_compte; + var $label_compte; + var $debit; + var $credit; + var $montant; + var $sens; + var $fk_user_author; + var $code_journal; + var $piece_num; + var $linesexport = array (); + var $linesmvt = array (); + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + $this->db = $db; + } + + /** + * Load a line into memory from database + * + * @param int $id id of line to get + * @return int <0 if KO, >0 if OK + */ + function fetch($id) + { + $sql = "SELECT rowid, doc_date, doc_type,"; + $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers, "; + $sql .= " numero_compte, label_compte, debit, credit, "; + $sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num "; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + $sql .= " WHERE rowid = '" . $id . "'"; + + dol_syslog(get_class($this) . "fetch sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $obj = $this->db->fetch_object($result); + + $this->id = $obj->rowid; + + $this->doc_date = $this->db->jdate($obj->doc_date); + $this->doc_type = $obj->doc_type; + $this->doc_ref = $obj->doc_ref; + $this->fk_doc = $obj->fk_doc; + $this->fk_docdet = $obj->fk_docdet; + $this->code_tiers = $obj->code_tiers; + $this->numero_compte = $obj->numero_compte; + $this->label_compte = $obj->label_compte; + $this->debit = $obj->debit; + $this->credit = $obj->credit; + $this->montant = $obj->montant; + $this->sens = $obj->sens; + $this->code_journal = $obj->code_journal; + $this->piece_num = $obj->piece_num; + } + else + { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::fetch " . $this->error, LOG_ERR); + return - 1; + } + + return 1; + } + + /** + * Load an accounting document into memory from database + * + * @param int $piecenum Accounting document to get + * @return int <0 if KO, >0 if OK + */ + function fetch_per_mvt($piecenum) + { + $sql = "SELECT piece_num,doc_date,code_journal,doc_ref,doc_type"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping"; + $sql .= " WHERE piece_num = '" . $piecenum . "'"; + + dol_syslog(get_class($this) . "fetch_per_mvt sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $obj = $this->db->fetch_object($result); + + $this->piece_num = $obj->piece_num; + $this->code_journal = $obj->code_journal; + $this->doc_date = $this->db->jdate($obj->doc_date); + $this->doc_ref = $obj->doc_ref; + $this->doc_type = $obj->doc_type; + } else { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::fetch_per_mvt " . $this->error, LOG_ERR); + return - 1; + } + + return 1; + } + + /** + * Return next number movement + * + * @return string Last number + */ + function getNextNumMvt() { + $sql = "SELECT MAX(piece_num)+1 as max FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping"; + + dol_syslog(get_class($this) . "getNextNumMvt sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + + if ($result) + { + $obj = $this->db->fetch_object($result); + + return $obj->max; + } + else + { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::getNextNumMvt " . $this->error, LOG_ERR); + return - 1; + } + } + + /** + * Load all informations of accountancy document + * + * @param int $piecenum id of line to get + * @return int <0 if KO, >0 if OK + */ + function fetch_all_per_mvt($piecenum) + { + $sql = "SELECT rowid, doc_date, doc_type,"; + $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,"; + $sql .= " numero_compte, label_compte, debit, credit,"; + $sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + $sql .= " WHERE piece_num = '" . $piecenum . "'"; + + dol_syslog(get_class($this) . "fetch_all_per_mvt sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + + while ( $obj = $this->db->fetch_object($result) ) { + + $line = new BookKeepingLine(); + + $line->id = $obj->rowid; + + $line->doc_date = $this->db->jdate($obj->doc_date); + $line->doc_type = $obj->doc_type; + $line->doc_ref = $obj->doc_ref; + $line->fk_doc = $obj->fk_doc; + $line->fk_docdet = $obj->fk_docdet; + $line->code_tiers = $obj->code_tiers; + $line->numero_compte = $obj->numero_compte; + $line->label_compte = $obj->label_compte; + $line->debit = $obj->debit; + $line->credit = $obj->credit; + $line->montant = $obj->montant; + $line->sens = $obj->sens; + $line->code_journal = $obj->code_journal; + $line->piece_num = $obj->piece_num; + + $this->linesmvt[] = $line; + } + } else { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::fetch_per_mvt " . $this->error, LOG_ERR); + return - 1; + } + + return 1; + } + + /** + * Insert line into bookkeeping + * + * @param User $user User who inserted operation + * @return $result Result + */ + function create($user='') + { + global $conf, $user, $langs; + + $this->piece_num = 0; + + // first check if line not yet in bookkeeping + $sql = "SELECT count(*)"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + $sql .= " WHERE doc_type = '" . $this->doc_type . "'"; + $sql .= " AND fk_docdet = " . $this->fk_docdet; + $sql .= " AND numero_compte = '" . $this->numero_compte . "'"; + + dol_syslog(get_class($this) . ":: create sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + + if ($resql) { + $row = $this->db->fetch_array($resql); + if ($row[0] == 0) { + + // Determine piece_num + $sqlnum = "SELECT piece_num"; + $sqlnum .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + $sqlnum .= " WHERE doc_type = '" . $this->doc_type . "'"; + $sqlnum .= " AND fk_docdet = '" . $this->fk_docdet . "'"; + $sqlnum .= " AND doc_ref = '" . $this->doc_ref . "'"; + + dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG); + $resqlnum = $this->db->query($sqlnum); + if ($resqlnum) + { + $objnum = $this->db->fetch_object($resqlnum); + $this->piece_num = $objnum->piece_num; + } + dol_syslog(get_class($this) . ":: create this->piece_num=" . $this->piece_num, LOG_DEBUG); + if (empty($this->piece_num)) + { + $sqlnum = "SELECT MAX(piece_num)+1 as maxpiecenum"; + $sqlnum .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + + dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG); + $resqlnum = $this->db->query($sqlnum); + if ($resqlnum) { + $objnum = $this->db->fetch_object($resqlnum); + $this->piece_num = $objnum->maxpiecenum; + } + } + dol_syslog(get_class($this) . ":: create this->piece_num=" . $this->piece_num, LOG_DEBUG); + if (empty($this->piece_num)) { + $this->piece_num = 1; + } + + $now = dol_now(); + if (empty($this->date_create)) + $this->date_create = $now(); + + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "accounting_bookkeeping (doc_date, "; + $sql .= "doc_type, doc_ref,fk_doc,fk_docdet,code_tiers,numero_compte,label_compte,"; + $sql .= "debit,credit,montant,sens,fk_user_author,import_key,code_journal,piece_num)"; + $sql .= " VALUES ('" . $this->doc_date . "','" . $this->doc_type . "','" . $this->doc_ref . "'," . $this->fk_doc . ","; + $sql .= $this->fk_docdet . ",'" . $this->code_tiers . "','" . $this->numero_compte . "','" . $this->db->escape($this->label_compte) . "',"; + $sql .= $this->debit . "," . $this->credit . "," . $this->montant . ",'" . $this->sens . "'," . $user->id . ", '"; + $sql .= $this->date_create . "','" . $this->code_journal . "'," . $this->piece_num . ")"; + + dol_syslog(get_class($this) . ":: create sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + $id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accounting_bookkeeping"); + + if ($id > 0) { + $this->id = $id; + $result = 0; + } else { + $result = - 2; + dol_syslog("BookKeeping::Create Erreur $result lecture ID"); + } + } else { + $result = - 1; + dol_syslog("BookKeeping::Create Erreur $result INSERT Mysql"); + } + } else { + $result = - 3; + dol_syslog("BookKeeping::Create Erreur $result SELECT Mysql"); + } + } else { + $result = - 5; + dol_syslog("BookKeeping::Create Erreur $result SELECT Mysql"); + } + + return $result; + } + + /** + * Delete bookkepping by importkey + * + * @param string $importkey Import key + * @return int Result + */ + function delete_by_importkey($importkey) { + $this->db->begin(); + + // first check if line not yet in bookkeeping + $sql = "DELETE"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + $sql .= " WHERE import_key = '" . $importkey . "'"; + + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } else { + $this->db->commit(); + return 1; + } + } + + /** + * Create object into database + * + * @param User $user Object user that create + * @param int $notrigger 1=Does not execute triggers, 0 otherwise + * @return int <0 if KO, >0 if OK + */ + function create_std($user, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + // Clean parameters + if (isset($this->doc_type)) + $this->doc_type = trim($this->doc_type); + if (isset($this->doc_ref)) + $this->doc_ref = trim($this->doc_ref); + if (isset($this->fk_doc)) + $this->fk_doc = trim($this->fk_doc); + if (isset($this->fk_docdet)) + $this->fk_docdet = trim($this->fk_docdet); + if (isset($this->code_tiers)) + $this->code_tiers = trim($this->code_tiers); + if (isset($this->numero_compte)) + $this->numero_compte = trim($this->numero_compte); + if (isset($this->label_compte)) + $this->label_compte = trim($this->label_compte); + if (isset($this->debit)) + $this->debit = trim($this->debit); + if (isset($this->credit)) + $this->credit = trim($this->credit); + if (isset($this->montant)) + $this->montant = trim($this->montant); + if (isset($this->sens)) + $this->sens = trim($this->sens); + if (isset($this->fk_user_author)) + $this->fk_user_author = trim($this->fk_user_author); + if (isset($this->import_key)) + $this->import_key = trim($this->import_key); + if (isset($this->code_journal)) + $this->code_journal = trim($this->code_journal); + if (isset($this->piece_num)) + $this->piece_num = trim($this->piece_num); + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "accounting_bookkeeping("; + $sql .= "doc_date,"; + $sql .= "doc_type,"; + $sql .= "doc_ref,"; + $sql .= "fk_doc,"; + $sql .= "fk_docdet,"; + $sql .= "code_tiers,"; + $sql .= "numero_compte,"; + $sql .= "label_compte,"; + $sql .= "debit,"; + $sql .= "credit,"; + $sql .= "montant,"; + $sql .= "sens,"; + $sql .= "fk_user_author,"; + $sql .= "import_key,"; + $sql .= "code_journal,"; + $sql .= "piece_num"; + + $sql .= ") VALUES ("; + + $sql .= " " . (! isset($this->doc_date) || dol_strlen($this->doc_date) == 0 ? 'NULL' : $this->db->idate($this->doc_date)) . ","; + $sql .= " " . (! isset($this->doc_type) ? 'NULL' : "'" . $this->db->escape($this->doc_type) . "'") . ","; + $sql .= " " . (! isset($this->doc_ref) ? 'NULL' : "'" . $this->db->escape($this->doc_ref) . "'") . ","; + $sql .= " " . (! isset($this->fk_doc) ? 'NULL' : "'" . $this->fk_doc . "'") . ","; + $sql .= " " . (! isset($this->fk_docdet) ? 'NULL' : "'" . $this->fk_docdet . "'") . ","; + $sql .= " " . (! isset($this->code_tiers) ? 'NULL' : "'" . $this->db->escape($this->code_tiers) . "'") . ","; + $sql .= " " . (! isset($this->numero_compte) ? 'NULL' : "'" . $this->db->escape($this->numero_compte) . "'") . ","; + $sql .= " " . (! isset($this->label_compte) ? 'NULL' : "'" . $this->db->escape($this->label_compte) . "'") . ","; + $sql .= " " . (! isset($this->debit) ? 'NULL' : "'" . $this->debit . "'") . ","; + $sql .= " " . (! isset($this->credit) ? 'NULL' : "'" . $this->credit . "'") . ","; + $sql .= " " . (! isset($this->montant) ? 'NULL' : "'" . $this->montant . "'") . ","; + $sql .= " " . (! isset($this->sens) ? 'NULL' : "'" . $this->db->escape($this->sens) . "'") . ","; + $sql .= " " . $user->id . ","; + $sql .= " " . (! isset($this->import_key) ? 'NULL' : "'" . $this->db->escape($this->import_key) . "'") . ","; + $sql .= " " . (! isset($this->code_journal) ? 'NULL' : "'" . $this->db->escape($this->code_journal) . "'") . ","; + $sql .= " " . (! isset($this->piece_num) ? 'NULL' : "'" . $this->piece_num . "'") . ""; + + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this) . "::create_std sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + + if (! $error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accounting_bookkeeping"); + + if (! $notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + // // Call triggers + // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + // $interface=new Interfaces($this->db); + // $result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf); + // if ($result < 0) { $error++; $this->errors=$interface->errors; } + // // End call triggers + } + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::create_std " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } else { + $this->db->commit(); + return $this->id; + } + } + + /** + * Update object into database + * + * @param User $user Object user that create + * @param int $notrigger 1=Does not execute triggers, 0 otherwise + * @return int <0 if KO, >0 if OK + */ + function update($user = 0, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + // Clean parameters + if (isset($this->doc_type)) + $this->doc_type = trim($this->doc_type); + if (isset($this->doc_ref)) + $this->doc_ref = trim($this->doc_ref); + if (isset($this->fk_doc)) + $this->fk_doc = trim($this->fk_doc); + if (isset($this->fk_docdet)) + $this->fk_docdet = trim($this->fk_docdet); + if (isset($this->code_tiers)) + $this->code_tiers = trim($this->code_tiers); + if (isset($this->numero_compte)) + $this->numero_compte = trim($this->numero_compte); + if (isset($this->label_compte)) + $this->label_compte = trim($this->label_compte); + if (isset($this->debit)) + $this->debit = trim($this->debit); + if (isset($this->credit)) + $this->credit = trim($this->credit); + if (isset($this->montant)) + $this->montant = trim($this->montant); + if (isset($this->sens)) + $this->sens = trim($this->sens); + if (isset($this->fk_user_author)) + $this->fk_user_author = trim($this->fk_user_author); + if (isset($this->import_key)) + $this->import_key = trim($this->import_key); + if (isset($this->code_journal)) + $this->code_journal = trim($this->code_journal); + if (isset($this->piece_num)) + $this->piece_num = trim($this->piece_num); + + // Check parameters + // Put here code to add a control on parameters values + + // Update request + $sql = "UPDATE " . MAIN_DB_PREFIX . "accounting_bookkeeping SET"; + + $sql .= " doc_date=" . (dol_strlen($this->doc_date) != 0 ? "'" . $this->db->idate($this->doc_date) . "'" : 'null') . ","; + $sql .= " doc_type=" . (isset($this->doc_type) ? "'" . $this->db->escape($this->doc_type) . "'" : "null") . ","; + $sql .= " doc_ref=" . (isset($this->doc_ref) ? "'" . $this->db->escape($this->doc_ref) . "'" : "null") . ","; + $sql .= " fk_doc=" . (isset($this->fk_doc) ? $this->fk_doc : "null") . ","; + $sql .= " fk_docdet=" . (isset($this->fk_docdet) ? $this->fk_docdet : "null") . ","; + $sql .= " code_tiers=" . (isset($this->code_tiers) ? "'" . $this->db->escape($this->code_tiers) . "'" : "null") . ","; + $sql .= " numero_compte=" . (isset($this->numero_compte) ? "'" . $this->db->escape($this->numero_compte) . "'" : "null") . ","; + $sql .= " label_compte=" . (isset($this->label_compte) ? "'" . $this->db->escape($this->label_compte) . "'" : "null") . ","; + $sql .= " debit=" . (isset($this->debit) ? $this->debit : "null") . ","; + $sql .= " credit=" . (isset($this->credit) ? $this->credit : "null") . ","; + $sql .= " montant=" . (isset($this->montant) ? $this->montant : "null") . ","; + $sql .= " sens=" . (isset($this->sens) ? "'" . $this->db->escape($this->sens) . "'" : "null") . ","; + $sql .= " fk_user_author=" . (isset($this->fk_user_author) ? $this->fk_user_author : "null") . ","; + $sql .= " import_key=" . (isset($this->import_key) ? "'" . $this->db->escape($this->import_key) . "'" : "null") . ","; + $sql .= " code_journal=" . (isset($this->code_journal) ? "'" . $this->db->escape($this->code_journal) . "'" : "null") . ","; + $sql .= " piece_num=" . (isset($this->piece_num) ? $this->piece_num : "null") . ""; + + $sql .= " WHERE rowid=" . $this->id; + + $this->db->begin(); + + dol_syslog(get_class($this) . "::update sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + + if (! $error) { + if (! $notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + // // Call triggers + // include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + // $interface=new Interfaces($this->db); + // $result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf); + // if ($result < 0) { $error++; $this->errors=$interface->errors; } + // // End call triggers + } + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::update " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } else { + $this->db->commit(); + return 1; + } + } + + /** + * Delete object in database + * + * @param User $user Object user that create + * @param int $notrigger 1=Does not execute triggers, 0 otherwise + * @return int <0 if KO, >0 if OK + */ + function delete($user, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + $this->db->begin(); + + if (! $error) + { + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('ACCOUNTING_NUMPIECE_DELETE',$user); + if ($result < 0) $error++; + // End call triggers + } + } + + if (! $error) { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping"; + $sql .= " WHERE rowid=" . $this->id; + + dol_syslog(get_class($this) . "::delete sql=" . $sql); + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + /** + * Delete bookkepping by importkey + * + * @param string $model Model + * @return int Result + */ + function export_bookkeping($model = 'ebp') + { + $sql = "SELECT rowid, doc_date, doc_type,"; + $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,"; + $sql .= " numero_compte, label_compte, debit, credit,"; + $sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping"; + + $resql = $this->db->query($sql); + + dol_syslog(get_class($this) . "::export_bookkeping sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + $this->linesexport = array (); + + $num = $this->db->num_rows($resql); + while ( $obj = $this->db->fetch_object($resql) ) { + $line = new BookKeepingLine(); + + $line->id = $obj->rowid; + + $line->doc_date = $this->db->jdate($obj->doc_date); + $line->doc_type = $obj->doc_type; + $line->doc_ref = $obj->doc_ref; + $line->fk_doc = $obj->fk_doc; + $line->fk_docdet = $obj->fk_docdet; + $line->code_tiers = $obj->code_tiers; + $line->numero_compte = $obj->numero_compte; + $line->label_compte = $obj->label_compte; + $line->debit = $obj->debit; + $line->credit = $obj->credit; + $line->montant = $obj->montant; + $line->sens = $obj->sens; + $line->code_journal = $obj->code_journal; + $line->piece_num = $obj->piece_num; + + $this->linesexport[] = $line; + } + $this->db->free($resql); + + return $num; + } + else + { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::export_bookkeping " . $this->error, LOG_ERR); + return - 1; + } + } +} + +/** + * Class BookKeepingLine + */ +class BookKeepingLine +{ + var $id; + var $doc_date; + var $doc_type; + var $doc_ref; + var $fk_doc; + var $fk_docdet; + var $code_tiers; + var $numero_compte; + var $label_compte; + var $debit; + var $credit; + var $montant; + var $sens; + var $fk_user_author; + var $code_journal; + var $piece_num; +} \ No newline at end of file diff --git a/htdocs/accountancy/class/html.formventilation.class.php b/htdocs/accountancy/class/html.formventilation.class.php new file mode 100644 index 00000000000..7385219780b --- /dev/null +++ b/htdocs/accountancy/class/html.formventilation.class.php @@ -0,0 +1,259 @@ + + * Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/class/html.formventilation.class.php + * \ingroup Accounting Expert + * \brief File of class with all html predefined components + */ + +/** + * Class to manage generation of HTML components for bank module + */ +class FormVentilation extends Form +{ + var $db; + var $error; + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + /** + * Return select filter with date of transaction + * + * @param string $htmlname Name of select field + * @param string $selectedkey Value + * @return string HTML edit field + */ + function select_bookkeeping_importkey($htmlname = 'importkey', $selectedkey='') + { + global $langs; + + $date_array = array (); + + $sql = 'SELECT DISTINCT import_key from ' . MAIN_DB_PREFIX . 'accounting_bookkeeping'; + $sql .= ' ORDER BY import_key DESC'; + + $out = ''; + + return $out; + } + + /** + * Return list of accounts with label by chart of accounts + * + * @param string $selectid Preselected chart of accounts + * @param string $htmlname Name of field in html form + * @param int $showempty Add an empty field + * @param array $event Event options + * + * @return string String with HTML select + */ + function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array()) + { + global $conf, $user, $langs; + + $out = ''; + + $sql = "SELECT DISTINCT aa.account_number, aa.label, aa.rowid, aa.fk_pcg_version"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accountingaccount as aa"; + $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; + $sql .= " AND asy.rowid = " . $conf->global->CHARTOFACCOUNTS; + $sql .= " AND aa.active = 1"; + $sql .= " ORDER BY aa.account_number"; + + dol_syslog(get_class($this) . "::select_account sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + + $out .= ajax_combobox($htmlname, $event); + $out .= ''; + } else { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::select_account " . $this->error, LOG_ERR); + return - 1; + } + $this->db->free($resql); + return $out; + } + + /** + * Return list of accounts with label by class of accounts + * + * @param string $selectid Preselected pcg_type + * @param string $htmlname Name of field in html form + * @param int $showempty Add an empty field + * @param array $event Event options + * + * @return string String with HTML select + */ + function select_pcgtype($selectid, $htmlname = 'pcg_type', $showempty = 0, $event = array()) + { + global $conf, $user, $langs; + + $out = ''; + + $sql = "SELECT DISTINCT pcg_type "; + $sql .= " FROM " . MAIN_DB_PREFIX . "accountingaccount "; + $sql .= " ORDER BY pcg_type"; + + dol_syslog(get_class($this) . "::select_pcgtype sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + + $out .= ajax_combobox($htmlname, $event); + + $out .= ''; + } else { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::select_pcgtype " . $this->error, LOG_ERR); + return - 1; + } + $this->db->free($resql); + return $out; + } + + /** + * Return list of accounts with label by sub_class of accounts + * + * @param string $selectid Preselected pcg_type + * @param string $htmlname Name of field in html form + * @param int $showempty Add an empty field + * @param array $event Event options + * + * @return string String with HTML select + */ + function select_pcgsubtype($selectid, $htmlname = 'pcg_subtype', $showempty = 0, $event = array()) + { + global $conf, $user, $langs; + + $out = ''; + + $sql = "SELECT DISTINCT pcg_subtype "; + $sql .= " FROM " . MAIN_DB_PREFIX . "accountingaccount "; + $sql .= " ORDER BY pcg_subtype"; + + dol_syslog(get_class($this) . "::select_pcgsubtype sql=" . $sql, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + + $out .= ajax_combobox($htmlname, $event); + + $out .= ''; + } else { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::select_pcgsubtype " . $this->error, LOG_ERR); + return - 1; + } + $this->db->free($resql); + return $out; + } +} diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php new file mode 100644 index 00000000000..08dc4b05bd9 --- /dev/null +++ b/htdocs/accountancy/customer/card.php @@ -0,0 +1,137 @@ + + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/customer/card.php + * \ingroup Accounting Expert + * \brief Card customer ventilation + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; + +// Langs +$langs->load("bills"); +$langs->load("accountancy"); + +$action = GETPOST('action', 'alpha'); +$codeventil = GETPOST('codeventil'); +$id = GETPOST('id'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +/* + * Actions + */ + +if ($action == 'ventil' && $user->rights->accounting->access) { + $sql = " UPDATE " . MAIN_DB_PREFIX . "facturedet"; + $sql .= " SET fk_code_ventilation = " . $codeventil; + $sql .= " WHERE rowid = " . $id; + + dol_syslog("/accounting/customer/card.php sql=" . $sql, LOG_DEBUG); + $resql = $db->query($sql); + if (! $resql) { + setEventMessage($db->lasterror(), 'errors'); + } +} + +llxHeader("", "", "FicheVentilation"); + +if ($cancel == $langs->trans("Cancel")) { + $action = ''; +} + +/* + * Create + */ +$form = new Form($db); +$facture_static = new Facture($db); +$formventilation = new FormVentilation($db); + +if (! empty($id)) { + $sql = "SELECT f.facnumber, f.rowid as facid, l.fk_product, l.description, l.price,"; + $sql .= " l.qty, l.rowid, l.tva_tx, l.remise_percent, l.subprice, p.accountancy_code_sell as code_sell,"; + $sql .= " l.fk_code_ventilation, aa.account_number, aa.label"; + $sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as l"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount as aa ON l.fk_code_ventilation = aa.rowid"; + $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = l.fk_facture"; + $sql .= " WHERE f.fk_statut > 0 AND l.rowid = " . $id; + + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; + } + + dol_syslog("/accounting/customer/card.php sql=" . $sql, LOG_DEBUG); + $result = $db->query($sql); + + if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + + if ($num_lines) { + + $objp = $db->fetch_object($result); + + print '
' . "\n"; + print ''; + print ''; + + print_fiche_titre($langs->trans("Ventilation")); + + print ''; + + // Ref facture + print ''; + $facture_static->ref = $objp->facnumber; + $facture_static->id = $objp->facid; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + + print '
' . $langs->trans("Invoice") . '' . $facture_static->getNomUrl(1) . '
' . $langs->trans("Line") . '' . nl2br($objp->description) . '
' . $langs->trans("Account") . ''; + print $objp->account_number . '-' . $objp->label; + print '
' . $langs->trans("NewAccount") . ''; + print $formventilation->select_account($objp->fk_code_ventilation, 'codeventil', 1); + print '
 
'; + print '
'; + } else { + print "Error"; + } + } else { + print "Error"; + } +} else { + print "Error ID incorrect"; +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/customer/index.html b/htdocs/accountancy/customer/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php new file mode 100644 index 00000000000..a9723b72497 --- /dev/null +++ b/htdocs/accountancy/customer/index.php @@ -0,0 +1,345 @@ + + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/customer/index.php + * \ingroup Accounting Expert + * \brief Page accueil clients ventilation comptable + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +// Filter +$year = $_GET["year"]; +if ($year == 0) { + $year_current = strftime("%Y", time()); + $year_start = $year_current; +} else { + $year_current = $year; + $year_start = $year; +} + +// Validate History +$action = GETPOST('action'); +if ($action == 'validatehistory') { + + $error = 0; + $db->begin(); + + if ($db->type == 'pgsql') { + $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facturedet as fd"; + $sql1 .= " SET fd.fk_code_ventilation = accnt.rowid"; + $sql1 .= " FROM " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accountingaccount as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; + $sql1 .= " WHERE fd.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . $conf->global->CHARTOFACCOUNTS; + $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_sell=accnt.account_number"; + $sql1 .= " AND fd.fk_code_ventilation = 0"; + } else { + $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facturedet as fd, " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accountingaccount as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; + $sql1 .= " SET fd.fk_code_ventilation = accnt.rowid"; + $sql1 .= " WHERE fd.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . $conf->global->CHARTOFACCOUNTS; + $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_sell=accnt.account_number"; + $sql1 .= " AND fd.fk_code_ventilation = 0"; + } + + dol_syslog("/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG); + $resql1 = $db->query($sql1); + if (! $resql1) { + $error ++; + $db->rollback(); + setEventMessage($db->lasterror(), 'errors'); + } else { + $db->commit(); + setEventMessage($langs->trans('Dispatched'), 'mesgs'); + } +} + +/* + * View + */ +llxHeader('', $langs->trans("CustomersVentilation")); + +$textprevyear = "" . img_previous() . ""; +$textnextyear = " " . img_next() . ""; + +print_fiche_titre($langs->trans("CustomersVentilation") . " " . $textprevyear . " " . $langs->trans("Year") . " " . $year_start . " " . $textnextyear); + +print '' . $langs->trans("DescVentilCustomer") . ''; +print ''; + +$sql = "SELECT count(*) FROM " . MAIN_DB_PREFIX . "facturedet as fd"; +$sql .= " , " . MAIN_DB_PREFIX . "facture as f"; +$sql .= " WHERE fd.fk_code_ventilation = 0"; +$sql .= " AND f.rowid = fd.fk_facture AND f.fk_statut = 1;"; + +dol_syslog("/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG); +$result = $db->query($sql); +if ($result) { + $row = $db->fetch_row($result); + $nbfac = $row[0]; + $db->free($result); +} + +$y = $year_current; + +$var = true; + +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +$sql = "SELECT IF(aa.account_number IS NULL, 'Non pointe', aa.account_number) AS 'code comptable',"; +$sql .= " IF(aa.label IS NULL, 'Non pointe', aa.label) AS 'Intitulé',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=1,fd.total_ht,0)),2) AS 'Janvier',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=2,fd.total_ht,0)),2) AS 'Fevrier',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=3,fd.total_ht,0)),2) AS 'Mars',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=4,fd.total_ht,0)),2) AS 'Avril',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=5,fd.total_ht,0)),2) AS 'Mai',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=6,fd.total_ht,0)),2) AS 'Juin',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=7,fd.total_ht,0)),2) AS 'Juillet',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=8,fd.total_ht,0)),2) AS 'Aout',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=9,fd.total_ht,0)),2) AS 'Septembre',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=10,fd.total_ht,0)),2) AS 'Octobre',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=11,fd.total_ht,0)),2) AS 'Novembre',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=12,fd.total_ht,0)),2) AS 'Decembre',"; +$sql .= " ROUND(SUM(fd.total_ht),2) as 'Total'"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount as aa ON aa.rowid = fd.fk_code_ventilation"; +$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'"; +$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'"; + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; +} + +$sql .= " GROUP BY fd.fk_code_ventilation"; + +dol_syslog("/accountancy/customer/index.php sql=" . $sql, LOG_DEBUG); +$resql = $db->query($sql); +if ($resql) { + $i = 0; + $num = $db->num_rows($resql); + + while ( $i < $num ) { + $row = $db->fetch_row($resql); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + $i ++; + } + $db->free($resql); +} else { + print $db->lasterror(); // Show last sql error +} +print "
' . $langs->trans("Account") . '' . $langs->trans("Intitule") . '' . $langs->trans("JanuaryMin") . '' . $langs->trans("FebruaryMin") . '' . $langs->trans("MarchMin") . '' . $langs->trans("AprilMin") . '' . $langs->trans("MayMin") . '' . $langs->trans("JuneMin") . '' . $langs->trans("JulyMin") . '' . $langs->trans("AugustMin") . '' . $langs->trans("SeptemberMin") . '' . $langs->trans("OctoberMin") . '' . $langs->trans("NovemberMin") . '' . $langs->trans("DecemberMin") . '' . $langs->trans("Total") . '
' . $row[0] . '' . $row[1] . '' . price($row[2]) . '' . price($row[3]) . '' . price($row[4]) . '' . price($row[5]) . '' . price($row[6]) . '' . price($row[7]) . '' . price($row[8]) . '' . price($row[9]) . '' . price($row[10]) . '' . price($row[11]) . '' . price($row[12]) . '' . price($row[13]) . '' . price($row[14]) . '
\n"; + +print "
\n"; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +$sql = "SELECT '" . $langs->trans("Vide") . "' AS 'Total',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=1,fd.total_ht,0)),2) AS 'Janvier',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=2,fd.total_ht,0)),2) AS 'Fevrier',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=3,fd.total_ht,0)),2) AS 'Mars',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=4,fd.total_ht,0)),2) AS 'Avril',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=5,fd.total_ht,0)),2) AS 'Mai',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=6,fd.total_ht,0)),2) AS 'Juin',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=7,fd.total_ht,0)),2) AS 'Juillet',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=8,fd.total_ht,0)),2) AS 'Aout',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=9,fd.total_ht,0)),2) AS 'Septembre',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=10,fd.total_ht,0)),2) AS 'Octobre',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=11,fd.total_ht,0)),2) AS 'Novembre',"; +$sql .= " ROUND(SUM(IF(MONTH(f.datef)=12,fd.total_ht,0)),2) AS 'Decembre',"; +$sql .= " ROUND(SUM(fd.total_ht),2) as 'Total'"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture"; +$sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'"; +$sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'"; + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; +} + +dol_syslog('accountancy/customer/index.php:: $sql=' . $sql); +$resql = $db->query($sql); +if ($resql) { + $i = 0; + $num = $db->num_rows($resql); + + while ( $i < $num ) { + $row = $db->fetch_row($resql); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + $i ++; + } + $db->free($resql); +} else { + print $db->lasterror(); // Show last sql error +} +print "
' . $langs->trans("TotalVente") . '' . $langs->trans("JanuaryMin") . '' . $langs->trans("FebruaryMin") . '' . $langs->trans("MarchMin") . '' . $langs->trans("AprilMin") . '' . $langs->trans("MayMin") . '' . $langs->trans("JuneMin") . '' . $langs->trans("JulyMin") . '' . $langs->trans("AugustMin") . '' . $langs->trans("SeptemberMin") . '' . $langs->trans("OctoberMin") . '' . $langs->trans("NovemberMin") . '' . $langs->trans("DecemberMin") . '' . $langs->trans("Total") . '
' . $row[0] . '' . price($row[1]) . '' . price($row[2]) . '' . price($row[3]) . '' . price($row[4]) . '' . price($row[5]) . '' . price($row[6]) . '' . price($row[7]) . '' . price($row[8]) . '' . price($row[9]) . '' . price($row[10]) . '' . price($row[11]) . '' . price($row[12]) . '' . price($row[13]) . '
\n"; + +if (! empty($conf->margin->enabled)) { + print "
\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $sql = "SELECT '" . $langs->trans("Vide") . "' AS 'Marge',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=1,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Janvier',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=2,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Fevrier',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=3,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Mars',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=4,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Avril',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=5,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Mai',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=6,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Juin',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=7,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Juillet',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=8,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Aout',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=9,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Septembre',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=10,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Octobre',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=11,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Novembre',"; + $sql .= " ROUND(SUM(IF(MONTH(f.datef)=12,(fd.total_ht-(fd.qty * fd.buy_price_ht)),0)),2) AS 'Decembre',"; + $sql .= " ROUND(SUM((fd.total_ht-(fd.qty * fd.buy_price_ht))),2) as 'Total'"; + $sql .= " FROM " . MAIN_DB_PREFIX . "facturedet as fd"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = fd.fk_facture"; + $sql .= " WHERE f.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'"; + $sql .= " AND f.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'"; + + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; + } + + dol_syslog('accountancy/customer/index.php:: $sql=' . $sql); + $resql = $db->query($sql); + if ($resql) { + $i = 0; + $num = $db->num_rows($resql); + + while ( $i < $num ) { + $row = $db->fetch_row($resql); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + $i ++; + } + $db->free($resql); + } else { + print $db->lasterror(); // Show last sql error + } + print "
' . $langs->trans("TotalMarge") . '' . $langs->trans("JanuaryMin") . '' . $langs->trans("FebruaryMin") . '' . $langs->trans("MarchMin") . '' . $langs->trans("AprilMin") . '' . $langs->trans("MayMin") . '' . $langs->trans("JuneMin") . '' . $langs->trans("JulyMin") . '' . $langs->trans("AugustMin") . '' . $langs->trans("SeptemberMin") . '' . $langs->trans("OctoberMin") . '' . $langs->trans("NovemberMin") . '' . $langs->trans("DecemberMin") . '' . $langs->trans("Total") . '
' . $row[0] . '' . price($row[1]) . '' . price($row[2]) . '' . price($row[3]) . '' . price($row[4]) . '' . price($row[5]) . '' . price($row[6]) . '' . price($row[7]) . '' . price($row[8]) . '' . price($row[9]) . '' . price($row[10]) . '' . price($row[11]) . '' . price($row[12]) . '' . price($row[13]) . '
\n"; +} +print "\n"; +print ''; + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php new file mode 100644 index 00000000000..aff9f7aa3a7 --- /dev/null +++ b/htdocs/accountancy/customer/lines.php @@ -0,0 +1,223 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Ari Elbaz (elarifr) + * Copyright (C) 2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/customer/lines.php + * \ingroup Accounting Expert + * \brief Page of detail of the lines of ventilation of invoices customers + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + +// langs +$langs->load("bills"); +$langs->load("compta"); +$langs->load("main"); +$langs->load("accountancy"); + +$account_parent = GETPOST('account_parent'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$formventilation = new FormVentilation($db); + +// change account + +$changeaccount = GETPOST('changeaccount'); + +$is_search = GETPOST('button_search_x'); + +if (is_array($changeaccount) && count($changeaccount) > 0 && empty($is_search)) { + $error = 0; + + $db->begin(); + + $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facturedet as l"; + $sql1 .= " SET l.fk_code_ventilation=" . $account_parent; + $sql1 .= ' WHERE l.rowid IN (' . implode(',', $changeaccount) . ')'; + + dol_syslog('accountancy/customer/lines.php::changeaccount sql= ' . $sql1); + $resql1 = $db->query($sql1); + if (! $resql1) { + $error ++; + setEventMessage($db->lasterror(), 'errors'); + } + if (! $error) { + $db->commit(); + setEventMessage($langs->trans('Save'), 'mesgs'); + } else { + $db->rollback(); + setEventMessage($db->lasterror(), 'errors'); + } +} + +/* + * View + */ + +llxHeader('', $langs->trans("CustomersVentilation") . ' - ' . $langs->trans("Dispatched")); + +$page = GETPOST("page"); +if ($page < 0) + $page = 0; + +if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) { + $limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION; +} elseif ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) { + $limit = $conf->liste_limit; +} else { + $limit = $conf->liste_limit; +} + +$offset = $limit * $page; + +$sql = "SELECT l.rowid , f.facnumber, f.rowid as facid, l.fk_product, l.description, l.total_ht, l.qty, l.tva_tx, l.fk_code_ventilation, aa.label, aa.account_number,"; +$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture as f"; +$sql .= " , " . MAIN_DB_PREFIX . "accountingaccount as aa"; +$sql .= " , " . MAIN_DB_PREFIX . "facturedet as l"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product"; +$sql .= " WHERE f.rowid = l.fk_facture AND f.fk_statut >= 1 AND l.fk_code_ventilation <> 0 "; +$sql .= " AND aa.rowid = l.fk_code_ventilation"; +if (strlen(trim(GETPOST("search_facture")))) { + $sql .= " AND f.facnumber like '%" . GETPOST("search_facture") . "%'"; +} +if (strlen(trim(GETPOST("search_ref")))) { + $sql .= " AND p.ref like '%" . GETPOST("search_ref") . "%'"; +} +if (strlen(trim(GETPOST("search_label")))) { + $sql .= " AND p.label like '%" . GETPOST("search_label") . "%'"; +} +if (strlen(trim(GETPOST("search_desc")))) { + $sql .= " AND l.description like '%" . GETPOST("search_desc") . "%'"; +} +if (strlen(trim(GETPOST("search_account")))) { + $sql .= " AND aa.account_number like '%" . GETPOST("search_account") . "%'"; +} + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; +} + +$sql .= " ORDER BY l.rowid"; +if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE > 0) { + $sql .= " DESC "; +} +$sql .= $db->plimit($limit + 1, $offset); + +dol_syslog("/accountancy/customer/linges.php sql=" . $sql, LOG_DEBUG); +$result = $db->query($sql); +if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + + // TODO : print_barre_liste always use $conf->liste_limit and do not care about custom limit in list... + print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines); + + print '' . $langs->trans("DescVentilDoneCustomer") . ''; + + print '
'; + print ''; + + print '

' . $langs->trans("ChangeAccount"); + print $formventilation->select_account($account_parent, 'account_parent', 1); + print '
'; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + $facture_static = new Facture($db); + $product_static = new Product($db); + + $var = True; + while ( $objp = $db->fetch_object($result) ) { + $var = ! $var; + $codeCompta = $objp->account_number . ' ' . $objp->label; + + print ""; + + // Ref facture + $facture_static->ref = $objp->facnumber; + $facture_static->id = $objp->facid; + print ''; + + // Ref produit + $product_static->ref = $objp->product_ref; + $product_static->id = $objp->product_id; + $product_static->type = $objp->type; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + + print ""; + $i ++; + } +} else { + print $db->error(); +} + +print "
' . $langs->trans("Invoice") . '' . $langs->trans("Ref") . '' . $langs->trans("Label") . '' . $langs->trans("Description") . '' . $langs->trans("Amount") . '' . $langs->trans("Account") . '  
  '; + print ''; + print ' 
' . $facture_static->getNomUrl(1) . ''; + if ($product_static->id) + print $product_static->getNomUrl(1); + else + print ' '; + print '' . dol_trunc($objp->product_label, 24) . '' . nl2br(dol_trunc($objp->description, 32)) . '' . price($objp->total_ht) . '' . $codeCompta . '' . $objp->rowid . ''; + print img_edit(); + print '
"; + +$db->close(); +llxFooter(); \ No newline at end of file diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php new file mode 100644 index 00000000000..b67069cdf69 --- /dev/null +++ b/htdocs/accountancy/customer/list.php @@ -0,0 +1,237 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Ari Elbaz (elarifr) + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/customer/list.php + * \ingroup Accounting Expert + * \brief Ventilation page from customers invoices + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'accountancy/class/html.formventilation.class.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("main"); +$langs->load("accountancy"); + +$action = GETPOST('action'); +$codeventil = GETPOST('codeventil', 'array'); +$mesCasesCochees = GETPOST('mesCasesCochees', 'array'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$formventilation = new FormVentilation($db); + +llxHeader('', $langs->trans("Ventilation")); + +/* + * Action +*/ + +if ($action == 'ventil') { + print '
' . $langs->trans("Processing") . '...
'; + if (! empty($codeventil) && ! empty($mesCasesCochees)) { + print '
' . count($mesCasesCochees) . ' ' . $langs->trans("SelectedLines") . '
'; + $mesCodesVentilChoisis = $codeventil; + $cpt = 0; + foreach ( $mesCasesCochees as $maLigneCochee ) { + // print '
id selectionnee : '.$monChoix."
"; + $maLigneCourante = split("_", $maLigneCochee); + $monId = $maLigneCourante[0]; + $monNumLigne = $maLigneCourante[1]; + $monCompte = $mesCodesVentilChoisis[$monNumLigne]; + + $sql = " UPDATE " . MAIN_DB_PREFIX . "facturedet"; + $sql .= " SET fk_code_ventilation = " . $monCompte; + $sql .= " WHERE rowid = " . $monId; + + dol_syslog("/accountancy/customer/list.php sql=" . $sql, LOG_DEBUG); + if ($db->query($sql)) { + print '
' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' ' . $langs->trans("VentilatedinAccount") . ' : ' . $monCompte . '
'; + } else { + print '
' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' ' . $langs->trans("NotVentilatedinAccount") . ' : ' . $monCompte . '
' . $sql . '
'; + } + + $cpt ++; + } + } else { + print '
' . $langs->trans("AnyLineVentilate") . '
'; + } + print '
' . $langs->trans("EndProcessing") . '
'; +} + +/* + * Customer Invoice lines + */ +$page = GETPOST('page'); +if ($page < 0) + $page = 0; + +if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) { + $limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION; +} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) { + $limit = $conf->liste_limit; +} else { + $limit = $conf->liste_limit; +} + +$offset = $limit * $page; + +$sql = "SELECT f.facnumber, f.rowid as facid, l.fk_product, l.description, l.total_ht, l.rowid, l.fk_code_ventilation,"; +$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.accountancy_code_sell as code_sell"; +$sql .= " , aa.rowid as aarowid"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture as f"; +$sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facturedet as l ON f.rowid = l.fk_facture"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount as aa ON p.accountancy_code_sell = aa.account_number"; +$sql .= " WHERE f.fk_statut > 0 AND fk_code_ventilation = 0"; + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; +} + +$sql .= " ORDER BY l.rowid"; +if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) { + $sql .= " DESC "; +} +$sql .= $db->plimit($limit + 1, $offset); + +dol_syslog("/accountancy/customer/list.php sql=" . $sql, LOG_DEBUG); +$result = $db->query($sql); +if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + + // TODO : print_barre_liste always use $conf->liste_limit and do not care about custom limit in list... + print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines); + + print '
' . $langs->trans("DescVentilTodoCustomer") . '
'; + + print '
' . "\n"; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $facture_static = new Facture($db); + $product_static = new Product($db); + $form = new Form($db); + + $var = True; + while ( $i < min($num_lines, $limit) ) { + $objp = $db->fetch_object($result); + $var = ! $var; + + // product_type: 0 = service ? 1 = product + // if product does not exist we use the value of product_type provided in facturedet to define if this is a product or service + // issue : if we change product_type value in product DB it should differ from the value stored in facturedet DB ! + $code_sell_notset = ''; + + if (empty($objp->code_sell)) { + $code_sell_notset = 'color:red'; + + if (! empty($objp->type)) { + if ($objp->type == 1) { + $objp->code_sell = (! empty($conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT) ? $conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); + } else { + $objp->code_sell = (! empty($conf->global->COMPTA_SERVICE_SOLD_ACCOUNT) ? $conf->global->COMPTA_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); + } + } else { + $code_sell_notset = 'color:blue'; + + if ($objp->type == 1) { + $objp->code_sell = (! empty($conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT) ? $conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); + } else { + $objp->code_sell = (! empty($conf->global->COMPTA_SERVICE_SOLD_ACCOUNT) ? $conf->global->COMPTA_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); + } + } + } + + print ""; + + // Ref facture + $facture_static->ref = $objp->facnumber; + $facture_static->id = $objp->facid; + print ''; + + // Ref produit + $product_static->ref = $objp->product_ref; + $product_static->id = $objp->product_id; + $product_static->type = $objp->type; + print ''; + + print ''; + print ''; + + print ''; + + print ''; + + // Colonne choix du compte + print ''; + + // Colonne choix ligne a ventiler + print ''; + + print ''; + $i ++; + } + + print ''; + + print '
' . $langs->trans("Invoice") . '' . $langs->trans("Ref") . '' . $langs->trans("Label") . '' . $langs->trans("Description") . '' . $langs->trans("Amount") . '' . $langs->trans("AccountAccounting") . '' . $langs->trans("IntoAccount") . '' . $langs->trans("Ventilate") . '
' . $facture_static->getNomUrl(1) . ''; + if ($product_static->id) + print $product_static->getNomUrl(1); + else + print ' '; + print '' . dol_trunc($objp->product_label, 24) . '' . nl2br(dol_trunc($objp->description, 32)) . ''; + print price($objp->total_ht); + print ''; + print $objp->code_sell; + print ''; + print $formventilation->select_account($objp->aarowid, 'codeventil[]', 1); + print ''; + print 'code_sell ? "checked" : "") . '/>'; + print '
 
'; + print '
'; +} else { + print $db->error(); +} + +$db->close(); +llxFooter(); \ No newline at end of file diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php new file mode 100644 index 00000000000..4a57482a2d7 --- /dev/null +++ b/htdocs/accountancy/journal/bankjournal.php @@ -0,0 +1,572 @@ + + * Copyright (C) 2007-2010 Jean Heimburger + * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2013 Christophe Battarel + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Olivier Geffroy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/journal/bankjournal.php + * \ingroup Accounting Expert + * \brief Page with sells journal + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; + +// Langs +$langs->load("companies"); +$langs->load("other"); +$langs->load("compta"); +$langs->load("bank"); +$langs->load('bills'); +$langs->load("accountancy"); + +$id_accountancy_journal = GETPOST('id_account'); + +$date_startmonth = GETPOST('date_startmonth'); +$date_startday = GETPOST('date_startday'); +$date_startyear = GETPOST('date_startyear'); +$date_endmonth = GETPOST('date_endmonth'); +$date_endday = GETPOST('date_endday'); +$date_endyear = GETPOST('date_endyear'); +$action = GETPOST('action'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +/* + * View + */ +if (empty($id_accountancy_journal)) +{ + accessforbidden(); +} + +$year_current = strftime("%Y", dol_now()); +$pastmonth = strftime("%m", dol_now()) - 1; +$pastmonthyear = $year_current; +if ($pastmonth == 0) { + $pastmonth = 12; + $pastmonthyear --; +} + +$date_start = dol_mktime(0, 0, 0, $date_startmonth, $date_startday, $date_startyear); +$date_end = dol_mktime(23, 59, 59, $date_endmonth, $date_endday, $date_endyear); + +if (empty($date_start) || empty($date_end)) // We define date_start and date_end +{ + $date_start = dol_get_first_day($pastmonthyear, $pastmonth, false); + $date_end = dol_get_last_day($pastmonthyear, $pastmonth, false); +} + +$p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY); +$idpays = $p[0]; + +$sql = "SELECT b.rowid , b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type, soc.code_compta, ba.courant,"; +$sql .= " soc.code_compta_fournisseur, soc.rowid as socid, soc.nom as name, ba.account_number, bu1.type as typeop"; +$sql .= " FROM " . MAIN_DB_PREFIX . "bank b"; +$sql .= " JOIN " . MAIN_DB_PREFIX . "bank_account ba on b.fk_account=ba.rowid"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe soc on bu1.url_id=soc.rowid"; +// To isolate the cash of the other accounts +$sql .= " WHERE ba.courant <> 2"; +$sql .= " AND ba.rowid=".$id_accountancy_journal; +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND ba.entity = " . $conf->entity; +} +if ($date_start && $date_end) + $sql .= " AND b.dateo >= '" . $db->idate($date_start) . "' AND b.dateo <= '" . $db->idate($date_end) . "'"; +$sql .= " ORDER BY b.datev"; + +$object = new Account($db); +$paymentstatic = new Paiement($db); +$paymentsupplierstatic = new PaiementFourn($db); +$societestatic = new Societe($db); +$chargestatic = new ChargeSociales($db); +$paymentvatstatic = new TVA($db); +$paymentsalstatic = new PaymentSalary($db); + +dol_syslog("accountancy/journal/bankjournal.php:: sql=" . $sql, LOG_DEBUG); +$result = $db->query($sql); +if ($result) { + + $num = $db->num_rows($result); + // Variables + $cptfour = (! empty($conf->global->COMPTA_ACCOUNT_SUPPLIER) ? $conf->global->COMPTA_ACCOUNT_SUPPLIER : $langs->trans("CodeNotDef")); + $cptcli = (! empty($conf->global->COMPTA_ACCOUNT_CUSTOMER) ? $conf->global->COMPTA_ACCOUNT_CUSTOMER : $langs->trans("CodeNotDef")); + $cpttva = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); + $cptsociale = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); + + $tabpay = array (); + $tabbq = array (); + $tabtp = array (); + $tabcompany[$obj->rowid] = array ( + 'id' => $obj->socid, + 'name' => $obj->name, + 'code_client' => $obj->code_compta + ); + $tabtype = array (); + + $i = 0; + while ( $i < $num ) { + $obj = $db->fetch_object($result); + + // Controls + $compta_bank = $obj->account_number; + if ($obj->label == '(SupplierInvoicePayment)') + $compta_soc = (! empty($obj->code_compta_fournisseur) ? $obj->code_compta_fournisseur : $cptfour); + if ($obj->label == '(CustomerInvoicePayment)') + $compta_soc = (! empty($obj->code_compta) ? $obj->code_compta : $cptcli); + if ($obj->typeop == '(BankTransfert)') + $compta_soc = $conf->global->ACCOUNTING_ACCOUNT_TRANSFER_CASH; + + // Variable bookkeeping + $tabpay[$obj->rowid]["date"] = $obj->do; + $tabpay[$obj->rowid]["type_payment"] = $obj->fk_type; + $tabpay[$obj->rowid]["ref"] = $obj->label; + $tabpay[$obj->rowid]["fk_bank"] = $obj->rowid; + if (preg_match('/^\((.*)\)$/i', $obj->label, $reg)) { + $tabpay[$obj->rowid]["lib"] = $langs->trans($reg[1]); + } else { + $tabpay[$obj->rowid]["lib"] = dol_trunc($obj->label, 60); + } + $links = $object->get_url($obj->rowid); + + foreach ( $links as $key => $val ) { + + $tabtype[$obj->rowid] = $links[$key]['type']; + + if ($links[$key]['type'] == 'payment') { + $paymentstatic->id = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentstatic->getNomUrl(2); + } else if ($links[$key]['type'] == 'payment_supplier') { + $paymentsupplierstatic->id = $links[$key]['url_id']; + $paymentsupplierstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsupplierstatic->getNomUrl(2); + } else if ($links[$key]['type'] == 'company') { + + $societestatic->id = $links[$key]['url_id']; + $societestatic->nom = $links[$key]['label']; + $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); + $tabtp[$obj->rowid][$compta_soc] += $obj->amount; + } else if ($links[$key]['type'] == 'sc') { + + $chargestatic->id = $links[$key]['url_id']; + $chargestatic->ref = $links[$key]['url_id']; + + $tabpay[$obj->rowid]["lib"] .= ' ' . $chargestatic->getNomUrl(2); + if (preg_match('/^\((.*)\)$/i', $links[$key]['label'], $reg)) { + if ($reg[1] == 'socialcontribution') + $reg[1] = 'SocialContribution'; + $chargestatic->lib = $langs->trans($reg[1]); + } else { + $chargestatic->lib = $links[$key]['label']; + } + $chargestatic->ref = $chargestatic->lib; + $tabpay[$obj->rowid]["soclib"] = $chargestatic->getNomUrl(1, 30); + + $sqlmid = 'SELECT cchgsoc.accountancy_code'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "c_chargesociales cchgsoc "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "chargesociales as chgsoc ON chgsoc.fk_type=cchgsoc.id"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementcharge as paycharg ON paycharg.fk_charge=chgsoc.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "bank_url as bkurl ON bkurl.url_id=paycharg.rowid"; + $sqlmid .= " WHERE bkurl.fk_bank=" . $obj->rowid; + + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $tabtp[$obj->rowid][$objmid->accountancy_code] += $obj->amount; + } + } else if ($links[$key]['type'] == 'payment_vat') { + + $paymentvatstatic->id = $links[$key]['url_id']; + $paymentvatstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); + $tabtp[$obj->rowid][$cpttva] += $obj->amount; + } else if ($links[$key]['type'] == 'payment_salary') { + + $paymentsalstatic->id = $links[$key]['url_id']; + $paymentsalstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsalstatic->getNomUrl(2); + $tabtp[$obj->rowid][$cptsociale] += $obj->amount; + } else if ($links[$key]['type'] == 'banktransfert') { + + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); + $tabtp[$obj->rowid][$cpttva] += $obj->amount; + } + /*else { + $tabtp [$obj->rowid] [$cptsociale] += $obj->amount; + }*/ + } + $tabbq[$obj->rowid][$compta_bank] += $obj->amount; + + // if($obj->socid)$tabtp[$obj->rowid][$compta_soc] += $obj->amount; + + $i ++; + } +} else { + dol_print_error($db); +} + +/* + * Actions +*/ + +// Write bookkeeping +if ($action == 'writeBookKeeping') { + $error = 0; + foreach ( $tabpay as $key => $val ) { + // Bank + foreach ( $tabbq[$key] as $k => $mt ) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->doc_type = 'bank'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_bank"]; + $bookkeeping->code_tiers = $tabcompany[$key]['code_client']; + $bookkeeping->numero_compte = $k; + $bookkeeping->label_compte = $compte->intitule; + $bookkeeping->montant = ($mt < 0 ? - $mt : $mt); + $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt >= 0 ? $mt : 0); + $bookkeeping->credit = ($mt < 0 ? - $mt : 0); + $bookkeeping->code_journal = $conf->global->ACCOUNTING_BANK_JOURNAL; + + if ($tabtype[$key] == 'payment') { + + $sqlmid = 'SELECT fac.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; + $sqlmid .= " WHERE pay.fk_bank=" . $key; + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + } else if ($tabtype[$key] == 'payment_supplier') { + + $sqlmid = 'SELECT facf.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; + $sqlmid .= " WHERE payf.fk_bank=" . $key; + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + } + + $result = $bookkeeping->create(); + if ($result < 0) { + $error ++; + setEventMessage($object->errors, 'errors'); + } + } + // Third party + foreach ( $tabtp[$key] as $k => $mt ) { + + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->doc_type = 'banque'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_bank"]; + $bookkeeping->label_compte = $tabcompany[$key]['name']; + $bookkeeping->montant = ($mt < 0 ? - $mt : $mt); + $bookkeeping->sens = ($mt < 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt < 0 ? - $mt : 0); + $bookkeeping->credit = ($mt >= 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_BANK_JOURNAL; + + if ($tabtype[$key] == 'sc') { + $bookkeeping->code_tiers = ''; + $bookkeeping->numero_compte = $k; + } else if ($tabtype[$key] == 'payment') { + + $sqlmid = 'SELECT fac.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; + $sqlmid .= " WHERE pay.fk_bank=" . $key; + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + $bookkeeping->code_tiers = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + } else if ($tabtype[$key] == 'payment_supplier') { + + $sqlmid = 'SELECT facf.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; + $sqlmid .= " WHERE payf.fk_bank=" . $key; + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + $bookkeeping->code_tiers = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_SUPPLIER; + } else if ($tabtype[$key] == 'company') { + + $sqlmid = 'SELECT fac.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; + $sqlmid .= " WHERE pay.fk_bank=" . $key; + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + $bookkeeping->code_tiers = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + } else { + + $bookkeeping->doc_ref = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + } + + $result = $bookkeeping->create(); + if ($result < 0) { + $error ++; + setEventMessage($object->errors, 'errors'); + } + } + } + + if (empty($error)) { + setEventMessage($langs->trans('Success'), 'mesgs'); + } +} +// export csv +if ($action == 'export_csv') { + $sep = $conf->global->ACCOUNTING_SEPARATORCSV; + + header('Content-Type: text/csv'); + header('Content-Disposition: attachment;filename=journal_banque.csv'); + + $companystatic = new Client($db); + + if ($conf->global->ACCOUNTING_MODELCSV == 1) // Modèle Export Cegid Expert + { + foreach ( $tabpay as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); + + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + + // Bank + print $date . $sep; + print $conf->global->ACCOUNTING_BANK_JOURNAL . $sep; + foreach ( $tabbq[$key] as $k => $mt ) { + print length_accountg(html_entity_decode($k)) . $sep; + print $sep; + print ($mt < 0 ? 'C' : 'D') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print $val["type_payment"] . $sep; + print $sep; + } + print "\n"; + + // Third party + foreach ( $tabtp[$key] as $k => $mt ) { + if ($mt) { + print $date . $sep; + print $conf->global->ACCOUNTING_BANK_JOURNAL . $sep; + if ($val["lib"] == '(SupplierInvoicePayment)') { + print length_accountg($conf->global->COMPTA_ACCOUNT_SUPPLIER) . $sep; + } else { + print length_accountg($conf->global->COMPTA_ACCOUNT_CUSTOMER) . $sep; + } + print length_accounta(html_entity_decode($k)) . $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print $val["type_payment"] . $sep; + print $sep; + print "\n"; + } + } + } + } else // Modèle Export Classique + { + foreach ( $tabpay as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), 'day'); + + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + + print '"' . $date . '"' . $sep; + print '"' . $val["type_payment"] . '"' . $sep; + + // Bank + foreach ( $tabbq[$key] as $k => $mt ) { + print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; + print '"' . $langs->trans("Bank") . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"'; + } + print "\n"; + + // Third party + foreach ( $tabtp[$key] as $k => $mt ) { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["type_payment"] . '"' . $sep; + + print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; + print '"' . $companystatic->name . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + print "\n"; + } + } + } + } +} else { + + $form = new Form($db); + + llxHeader('', $langs->trans("BankJournal")); + + $nom = $langs->trans("BankJournal"); + $nomlink = ''; + $periodlink = ''; + $exportlink = ''; + $builddate = time(); + $description = $langs->trans("DescBankJournal") . '
'; + $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); + report_header($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => '')); + + print ''; + + print ''; + + print ' + '; + + /* + * Show result array + */ + print '

'; + + $i = 0; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print "\n"; + + $var = true; + $r = ''; + + foreach ( $tabpay as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), 'day'); + + if ($val["lib"] == '(SupplierInvoicePayment)') + $reflabel = $langs->trans('SupplierInvoicePayment'); + if ($val["lib"] == '(CustomerInvoicePayment)') + $reflabel = $langs->trans('CustomerInvoicePayment'); + + // Bank + foreach ( $tabbq[$key] as $k => $mt ) { + if (1) { + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + } + } + + // Third party + foreach ( $tabtp[$key] as $k => $mt ) { + if ($k != 'type') { + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + } + } + + $var = ! $var; + } + + print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("Account") . "" . $langs->trans("Type") . "" . $langs->trans("PaymentMode") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $reflabel . "" . length_accountg($k) . "" . $langs->trans('Bank') . "" . $val["type_payment"] . "" . ($mt >= 0 ? price($mt) : '') . "" . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $val["soclib"] . "" . length_accounta($k) . "" . $langs->trans('ThirdParty') . " (" . $val['soclib'] . ")" . $val["type_payment"] . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
"; + + // End of page + llxFooter(); +} +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/journal/cashjournal.php b/htdocs/accountancy/journal/cashjournal.php new file mode 100644 index 00000000000..f278a458ab5 --- /dev/null +++ b/htdocs/accountancy/journal/cashjournal.php @@ -0,0 +1,533 @@ + + * Copyright (C) 2007-2010 Jean Heimburger + * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2013 Christophe Battarel + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Olivier Geffroy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/journal/cashjournal.php + * \ingroup Accounting Expert + * \brief Page with cash journal + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; + +// Langs +$langs->load("companies"); +$langs->load("other"); +$langs->load("compta"); +$langs->load("bank"); +$langs->load("accountancy"); + +$date_startmonth = GETPOST('date_startmonth'); +$date_startday = GETPOST('date_startday'); +$date_startyear = GETPOST('date_startyear'); +$date_endmonth = GETPOST('date_endmonth'); +$date_endday = GETPOST('date_endday'); +$date_endyear = GETPOST('date_endyear'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$action = GETPOST('action'); + +/* + * View + */ + +$year_current = strftime("%Y", dol_now()); +$pastmonth = strftime("%m", dol_now()) - 1; +$pastmonthyear = $year_current; +if ($pastmonth == 0) { + $pastmonth = 12; + $pastmonthyear --; +} + +$date_start = dol_mktime(0, 0, 0, $date_startmonth, $date_startday, $date_startyear); +$date_end = dol_mktime(23, 59, 59, $date_endmonth, $date_endday, $date_endyear); + +if (empty($date_start) || empty($date_end)) // We define date_start and date_end +{ + $date_start = dol_get_first_day($pastmonthyear, $pastmonth, false); + $date_end = dol_get_last_day($pastmonthyear, $pastmonth, false); +} + +$p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY); +$idpays = $p[0]; + +$sql = "SELECT b.rowid , b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type, soc.code_compta, ba.courant,"; +$sql .= " soc.code_compta_fournisseur, soc.rowid as socid, soc.nom as name, ba.account_number, bu1.type as typeop"; +$sql .= " FROM " . MAIN_DB_PREFIX . "bank b"; +$sql .= " JOIN " . MAIN_DB_PREFIX . "bank_account ba on b.fk_account=ba.rowid"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe soc on bu1.url_id=soc.rowid"; + +// Code opération type caisse +$sql .= " WHERE ba.courant = 2"; +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND ba.entity = " . $conf->entity; +} + +if ($date_start && $date_end) + $sql .= " AND b.dateo >= '" . $db->idate($date_start) . "' AND b.dateo <= '" . $db->idate($date_end) . "'"; +$sql .= " ORDER BY b.datev"; + +$object = new Account($db); +$paymentstatic = new Paiement($db); +$paymentsupplierstatic = new PaiementFourn($db); +$societestatic = new Societe($db); +$chargestatic = new ChargeSociales($db); +$paymentvatstatic = new TVA($db); + +dol_syslog("accountancy/journal/cashjournal.php:: sql=" . $sql, LOG_DEBUG); +$result = $db->query($sql); +if ($result) { + + $num = $db->num_rows($result); + // les variables + $cptfour = (! empty($conf->global->COMPTA_ACCOUNT_SUPPLIER) ? $conf->global->COMPTA_ACCOUNT_SUPPLIER : $langs->trans("CodeNotDef")); + $cptcli = (! empty($conf->global->COMPTA_ACCOUNT_CUSTOMER) ? $conf->global->COMPTA_ACCOUNT_CUSTOMER : $langs->trans("CodeNotDef")); + $cpttva = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); + $cptsociale = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); + + $tabpay = array (); + $tabbq = array (); + $tabtp = array (); + $tabcompany = array (); + $tabtype = array (); + + $i = 0; + while ( $i < $num ) { + $obj = $db->fetch_object($result); + + // controls + $compta_bank = $obj->account_number; + if ($obj->label == '(SupplierInvoicePayment)') + $compta_soc = (! empty($obj->code_compta_fournisseur) ? $obj->code_compta_fournisseur : $cptfour); + if ($obj->label == '(CustomerInvoicePayment)') + $compta_soc = (! empty($obj->code_compta) ? $obj->code_compta : $cptcli); + if ($obj->typeop == '(BankTransfert)') + $compta_soc = $conf->global->ACCOUNTING_ACCOUNT_TRANSFER_CASH; + + // variable bookkeeping + + $tabpay[$obj->rowid]["date"] = $obj->do; + $tabpay[$obj->rowid]["ref"] = $obj->label; + $tabpay[$obj->rowid]["fk_bank"] = $obj->rowid; + if (preg_match('/^\((.*)\)$/i', $obj->label, $reg)) { + $tabpay[$obj->rowid]["lib"] = $langs->trans($reg[1]); + } else { + $tabpay[$obj->rowid]["lib"] = dol_trunc($obj->label, 60); + } + $links = $object->get_url($obj->rowid); + + foreach ( $links as $key => $val ) { + + $tabtype[$obj->rowid] = $links[$key]['type']; + + if ($links[$key]['type'] == 'payment') { + $paymentstatic->id = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentstatic->getNomUrl(2); + } else if ($links[$key]['type'] == 'payment_supplier') { + $paymentsupplierstatic->id = $links[$key]['url_id']; + $paymentsupplierstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsupplierstatic->getNomUrl(2); + } else if ($links[$key]['type'] == 'company') { + + $societestatic->id = $links[$key]['url_id']; + $societestatic->nom = $links[$key]['label']; + $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); + $tabtp[$obj->rowid][$compta_soc] += $obj->amount; + } else if ($links[$key]['type'] == 'sc') { + + $chargestatic->id = $links[$key]['url_id']; + $chargestatic->ref = $links[$key]['url_id']; + + $tabpay[$obj->rowid]["lib"] .= ' ' . $chargestatic->getNomUrl(2); + if (preg_match('/^\((.*)\)$/i', $links[$key]['label'], $reg)) { + if ($reg[1] == 'socialcontribution') + $reg[1] = 'SocialContribution'; + $chargestatic->lib = $langs->trans($reg[1]); + } else { + $chargestatic->lib = $links[$key]['label']; + } + $chargestatic->ref = $chargestatic->lib; + $tabpay[$obj->rowid]["soclib"] = $chargestatic->getNomUrl(1, 30); + + $sqlmid = 'SELECT cchgsoc.accountancy_code'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "c_chargesociales cchgsoc "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "chargesociales as chgsoc ON chgsoc.fk_type=cchgsoc.id"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementcharge as paycharg ON paycharg.fk_charge=chgsoc.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "bank_url as bkurl ON bkurl.url_id=paycharg.rowid"; + $sqlmid .= " WHERE bkurl.fk_bank=" . $obj->rowid; + dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $tabtp[$obj->rowid][$objmid->accountancy_code] += $obj->amount; + } + } else if ($links[$key]['type'] == 'payment_vat') { + + $paymentvatstatic->id = $links[$key]['url_id']; + $paymentvatstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); + $tabtp[$obj->rowid][$cpttva] += $obj->amount; + } else if ($links[$key]['type'] == 'banktransfert') { + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); + $tabtp[$obj->rowid][$cpttva] += $obj->amount; + } + /*else { + $tabtp [$obj->rowid] [$cptsociale] += $obj->amount; + }*/ + } + $tabbq[$obj->rowid][$compta_bank] += $obj->amount; + + // if($obj->socid)$tabtp[$obj->rowid][$compta_soc] += $obj->amount; + + $i ++; + } +} else { + dol_print_error($db); +} + +/* + * Actions +*/ + +// write bookkeeping +if ($action == 'writeBookKeeping') { + $error = 0; + foreach ( $tabpay as $key => $val ) { + // cash + foreach ( $tabbq[$key] as $k => $mt ) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->doc_type = 'cash'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_bank"]; + $bookkeeping->code_tiers = $tabcompany[$key]['code_client']; + $bookkeeping->numero_compte = $k; + $bookkeeping->label_compte = $compte->intitule; + $bookkeeping->montant = ($mt < 0 ? - $mt : $mt); + $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt >= 0 ? $mt : 0); + $bookkeeping->credit = ($mt < 0 ? - $mt : 0); + $bookkeeping->code_journal = $conf->global->ACCOUNTING_CASH_JOURNAL; + + if ($tabtype[$key] == 'payment') { + + $sqlmid = 'SELECT fac.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; + $sqlmid .= " WHERE pay.fk_bank=" . $key; + dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + } else if ($tabtype[$key] == 'payment_supplier') { + + $sqlmid = 'SELECT facf.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; + $sqlmid .= " WHERE payf.fk_bank=" . $key; + dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + } + + $result = $bookkeeping->create(); + if ($result < 0) { + $error ++; + setEventMessage($object->errors, 'errors'); + } + } + // third party + foreach ( $tabtp[$key] as $k => $mt ) { + + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->doc_type = 'cash'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_bank"]; + $bookkeeping->label_compte = $tabcompany[$key]['name']; + $bookkeeping->montant = ($mt < 0 ? - $mt : $mt); + $bookkeeping->sens = ($mt < 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt < 0 ? - $mt : 0); + $bookkeeping->credit = ($mt >= 0 ? $mt : 0); + $bookkeeping->code_journal = $conf->global->ACCOUNTING_CASH_JOURNAL; + + if ($tabtype[$key] == 'sc') { + $bookkeeping->code_tiers = ''; + $bookkeeping->numero_compte = $k; + } else if ($tabtype[$key] == 'payment') { + + $sqlmid = 'SELECT fac.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; + $sqlmid .= " WHERE pay.fk_bank=" . $key; + dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + $bookkeeping->code_tiers = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + } else if ($tabtype[$key] == 'payment_supplier') { + + $sqlmid = 'SELECT facf.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; + $sqlmid .= " WHERE payf.fk_bank=" . $key; + dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + $bookkeeping->code_tiers = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_SUPPLIER; + } else if ($tabtype[$key] == 'company') { + + $sqlmid = 'SELECT fac.facnumber'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement as pay ON payfac.fk_paiement=pay.rowid"; + $sqlmid .= " WHERE pay.fk_bank=" . $key; + dol_syslog("accountancy/journal/cashjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) { + $objmid = $db->fetch_object($resultmid); + $bookkeeping->doc_ref = $objmid->facnumber; + } + $bookkeeping->code_tiers = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + } else { + + $bookkeeping->doc_ref = $k; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + } + + $result = $bookkeeping->create(); + if ($result < 0) { + $error ++; + setEventMessage($object->errors, 'errors'); + } + } + } + + if (empty($error)) { + setEventMessage($langs->trans('Success'), 'mesgs'); + } +} +// export csv +if ($action == 'export_csv') { + $sep = $conf->global->ACCOUNTING_SEPARATORCSV; + + header('Content-Type: text/csv'); + header('Content-Disposition:attachment;filename=journal_caisse.csv'); + + if ($conf->global->ACCOUNTING_MODELCSV == 1) // Modèle Export Cegid Expert + { + foreach ( $tabpay as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); + + // Cash + print $date . $sep; + print $conf->global->ACCOUNTING_CASH_JOURNAL . $sep; + + foreach ( $tabbq[$key] as $k => $mt ) { + print length_accountg(html_entity_decode($k)) . $sep; + print $sep; + print ($mt < 0 ? 'C' : 'D') . $sep; + print price($mt) . $sep; + } + print utf8_decode($langs->trans("CashPayment")) . $sep; + print $val["ref"] . $sep; + print "\n"; + + // Third party + foreach ( $tabtp[$key] as $k => $mt ) { + if ($mt) { + print $date . $sep; + print $conf->global->ACCOUNTING_CASH_JOURNAL . $sep; + if ($obj->label == '(SupplierInvoicePayment)') { + print length_accountg($conf->global->COMPTA_ACCOUNT_SUPPLIER) . $sep; + } else { + print length_accountg($conf->global->COMPTA_ACCOUNT_CUSTOMER) . $sep; + } + print length_accounta(html_entity_decode($k)) . $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print price($mt) . $sep; + print $langs->trans("ThirdParty") . $sep; + print $val["ref"] . $sep; + print "\n"; + } + } + } + } else // Modèle Export Classique + { + foreach ( $tabpay as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), 'day'); + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + + // Cash + foreach ( $tabbq[$key] as $k => $mt ) { + print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; + print '"' . $langs->trans("Cash") . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"'; + } + print "\n"; + + // Third party + foreach ( $tabtp[$key] as $k => $mt ) { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; + print '"' . $langs->trans("ThirdParty") . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + print "\n"; + } + } + } + } +} else { + + $form = new Form($db); + + llxHeader('', $langs->trans("CashJournal"), ''); + + $nom = $langs->trans("CashJournal"); + $nomlink = ''; + $periodlink = ''; + $exportlink = ''; + $builddate = time(); + $description = $langs->trans("DescCashJournal") . '
'; + $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); + report_header($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => '')); + + print ''; + + print ''; + + print ' + '; + + /* + * Show result array + */ + print '

'; + + $i = 0; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print "\n"; + + $var = true; + $r = ''; + + foreach ( $tabpay as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), 'day'); + + // Cash + foreach ( $tabbq[$key] as $k => $mt ) { + if (1) { + print ""; + print ""; + print ""; + print ""; + print '"; + print '"; + print ""; + } + } + + // third party + foreach ( $tabtp[$key] as $k => $mt ) { + if ($k != 'type') { + print ""; + + print ""; + print ""; + + print ""; + print '"; + print '"; + } + } + + $var = ! $var; + } + + print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("Account") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $val["lib"] . "" . length_accountg($k) . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $val["soclib"] . "" . length_accounta($k) . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
"; + + // End of page + llxFooter(); +} +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/journal/index.html b/htdocs/accountancy/journal/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/accountancy/journal/index.php b/htdocs/accountancy/journal/index.php new file mode 100644 index 00000000000..272d76fa20f --- /dev/null +++ b/htdocs/accountancy/journal/index.php @@ -0,0 +1,48 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * \file htdocs/accountancy/journal/index.php + * \ingroup Accounting Expert + * \brief Index + */ + +require '../../main.inc.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +llxHeader('', 'Journaux', ''); + +$form = new Form($db); + +// End of page +$db->close(); +llxFooter(); \ No newline at end of file diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php new file mode 100644 index 00000000000..e0c2ceb8e36 --- /dev/null +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -0,0 +1,471 @@ + + * Copyright (C) 2007-2010 Jean Heimburger + * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/journal/purchasesjournal.php + * \ingroup Accounting Expert + * \brief Page with purchases journal + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +$date_startmonth = GETPOST('date_startmonth'); +$date_startday = GETPOST('date_startday'); +$date_startyear = GETPOST('date_startyear'); +$date_endmonth = GETPOST('date_endmonth'); +$date_endday = GETPOST('date_endday'); +$date_endyear = GETPOST('date_endyear'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$action = GETPOST('action'); + +/* + * View + */ + +$year_current = strftime("%Y", dol_now()); +$pastmonth = strftime("%m", dol_now()) - 1; +$pastmonthyear = $year_current; +if ($pastmonth == 0) { + $pastmonth = 12; + $pastmonthyear --; +} + +$date_start = dol_mktime(0, 0, 0, $date_startmonth, $date_startday, $date_startyear); +$date_end = dol_mktime(23, 59, 59, $date_endmonth, $date_endday, $date_endyear); + +if (empty($date_start) || empty($date_end)) // We define date_start and date_end +{ + $date_start = dol_get_first_day($pastmonthyear, $pastmonth, false); + $date_end = dol_get_last_day($pastmonthyear, $pastmonth, false); +} + +$p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY); +$idpays = $p[0]; + +$sql = "SELECT f.rowid, f.ref, f.type, f.datef as df, f.libelle,"; +$sql .= " fd.rowid as fdid, fd.description, fd.total_ttc, fd.tva_tx, fd.total_ht, fd.tva as total_tva, fd.product_type,"; +$sql .= " s.rowid as socid, s.nom as name, s.code_compta_fournisseur, s.fournisseur,"; +$sql .= " s.code_compta_fournisseur, p.accountancy_code_buy , ct.accountancy_code_buy as account_tva, aa.rowid as fk_compte, aa.account_number as compte, aa.label as label_compte"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn_det fd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_tva ct ON fd.tva_tx = ct.taux AND ct.fk_pays = '" . $idpays . "'"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product p ON p.rowid = fd.fk_product"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount aa ON aa.rowid = fd.fk_code_ventilation"; +$sql .= " JOIN " . MAIN_DB_PREFIX . "facture_fourn f ON f.rowid = fd.fk_facture_fourn"; +$sql .= " JOIN " . MAIN_DB_PREFIX . "societe s ON s.rowid = f.fk_soc"; +$sql .= " WHERE f.fk_statut > 0 "; +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = " . $conf->entity; +} +if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) + $sql .= " AND f.type IN (0,1,2)"; +else + $sql .= " AND f.type IN (0,1,2,3)"; +if ($date_start && $date_end) + $sql .= " AND f.datef >= '" . $db->idate($date_start) . "' AND f.datef <= '" . $db->idate($date_end) . "'"; +$sql .= " ORDER BY f.datef"; + +dol_syslog('accountancy/journal/purchasesjournal.php:: $sql=' . $sql); +$result = $db->query($sql); +if ($result) { + $num = $db->num_rows($result); + // les variables + $cptfour = (! empty($conf->global->COMPTA_ACCOUNT_SUPPLIER)) ? $conf->global->COMPTA_ACCOUNT_SUPPLIER : $langs->trans("CodeNotDef"); + $cpttva = (! empty($conf->global->COMPTA_VAT_ACCOUNT)) ? $conf->global->COMPTA_VAT_ACCOUNT : $langs->trans("CodeNotDef"); + + $tabfac = array (); + $tabht = array (); + $tabtva = array (); + $tabttc = array (); + $tabcompany = array (); + + $i = 0; + while ( $i < $num ) { + $obj = $db->fetch_object($result); + // contrôles + $compta_soc = (! empty($obj->code_compta_fournisseur)) ? $obj->code_compta_fournisseur : $cptfour; + $compta_prod = $obj->compte; + if (empty($compta_prod)) { + if ($obj->product_type == 0) + $compta_prod = (! empty($conf->global->COMPTA_PRODUCT_BUY_ACCOUNT)) ? $conf->global->COMPTA_PRODUCT_BUY_ACCOUNT : $langs->trans("CodeNotDef"); + else + $compta_prod = (! empty($conf->global->COMPTA_SERVICE_BUY_ACCOUNT)) ? $conf->global->COMPTA_SERVICE_BUY_ACCOUNT : $langs->trans("CodeNotDef"); + } + $compta_tva = (! empty($obj->account_tva) ? $obj->account_tva : $cpttva); + + $tabfac[$obj->rowid]["date"] = $obj->df; + $tabfac[$obj->rowid]["ref"] = $obj->ref; + $tabfac[$obj->rowid]["type"] = $obj->type; + $tabfac[$obj->rowid]["description"] = $obj->description; + $tabfac[$obj->rowid]["fk_facturefourndet"] = $obj->fdid; + $tabttc[$obj->rowid][$compta_soc] += $obj->total_ttc; + $tabht[$obj->rowid][$compta_prod] += $obj->total_ht; + $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva; + $tabcompany[$obj->rowid] = array ( + 'id' => $obj->socid, + 'name' => $obj->name, + 'code_fournisseur' => $obj->code_compta_fournisseur + ); + + $i ++; + } +} else { + dol_print_error($db); +} + +/* + * Actions +*/ +// Bookkeeping Write +if ($action == 'writebookkeeping') { + $now = dol_now(); + + foreach ( $tabfac as $key => $val ) { + foreach ( $tabttc[$key] as $k => $mt ) { + // get compte id and label + + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_create = $now; + $bookkeeping->doc_type = 'supplier_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_facturefourndet"]; + $bookkeeping->code_tiers = $tabcompany[$key]['code_fournisseur']; + $bookkeeping->label_compte = $tabcompany[$key]['name']; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_SUPPLIER; + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt >= 0) ? 'C' : 'D'; + $bookkeeping->debit = ($mt <= 0) ? $mt : 0; + $bookkeeping->credit = ($mt > 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_PURCHASE_JOURNAL; + + $bookkeeping->create(); + } + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + // get compte id and label + $compte = new AccountingAccount($db); + if ($compte->fetch(null, $k)) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_create = $now; + $bookkeeping->doc_type = 'supplier_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_facturefourndet"]; + $bookkeeping->code_tiers = ''; + $bookkeeping->label_compte = dol_trunc($val["description"], 128); + $bookkeeping->numero_compte = $k; + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt < 0) ? 'C' : 'D'; + $bookkeeping->debit = ($mt > 0) ? $mt : 0; + $bookkeeping->credit = ($mt <= 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_PURCHASE_JOURNAL; + + $bookkeeping->create(); + } + } + } + + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + // get compte id and label + + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_create = $now; + $bookkeeping->doc_type = 'supplier_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_facturefourndet"]; + $bookkeeping->code_tiers = ''; + $bookkeeping->label_compte = $langs->trans("VAT"); + $bookkeeping->numero_compte = $k; + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt < 0) ? 'C' : 'D'; + $bookkeeping->debit = ($mt > 0) ? $mt : 0; + $bookkeeping->credit = ($mt <= 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_PURCHASE_JOURNAL; + + $bookkeeping->create(); + } + } + } +} + +// export csv + +if ($action == 'export_csv') { + $sep = $conf->global->ACCOUNTING_SEPARATORCSV; + + header('Content-Type: text/csv'); + header('Content-Disposition: attachment;filename=journal_achats.csv'); + + if ($conf->global->ACCOUNTING_MODELCSV == 1) // Modèle Export Cegid Expert + { + foreach ( $tabfac as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + + if ($mt) { + print $date . $sep; + print $conf->global->ACCOUNTING_PURCHASE_JOURNAL . $sep; + print length_accountg(html_entity_decode($k)) . $sep; + print $sep; + print ($mt < 0 ? 'C' : 'D') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print dol_trunc($val["description"], 32) . $sep; + print $val["ref"]; + print "\n"; + } + } + + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + print $date . $sep; + print $conf->global->ACCOUNTING_PURCHASE_JOURNAL . $sep; + print length_accountg(html_entity_decode($k)) . $sep; + print $sep; + print ($mt < 0 ? 'C' : 'D') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print $langs->trans("VAT") . $sep; + print $val["ref"]; + print "\n"; + } + } + print $date . $sep; + print $conf->global->ACCOUNTING_PURCHASE_JOURNAL . $sep; + print length_accountg($conf->global->COMPTA_ACCOUNT_SUPPLIER) . $sep; + + foreach ( $tabttc[$key] as $k => $mt ) { + print length_accounta(html_entity_decode($k)) . $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print utf8_decode($companystatic->name) . $sep; + print $val["ref"]; + } + print "\n"; + } + } else // Modèle Export Classique + { + foreach ( $tabfac as $key => $val ) { + $date = dol_print_date($db->jdate($val["date"]), 'day'); + + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; + print '"' . dol_trunc($val["description"], 32) . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"'; + print "\n"; + } + } + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; + print '"' . $langs->trans("VAT") . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"'; + print "\n"; + } + } + + // Third party + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + foreach ( $tabttc[$key] as $k => $mt ) { + print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; + print '"' . utf8_decode($companystatic->name) . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + } + print "\n"; + } + } +} else { + + llxHeader('', '', ''); + + $form = new Form($db); + + $nom = $langs->trans("PurchasesJournal"); + $nomlink = ''; + $periodlink = ''; + $exportlink = ''; + $builddate = time(); + $description = $langs->trans("DescPurchasesJournal") . '
'; + if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) + $description .= $langs->trans("DepositsAreNotIncluded"); + else + $description .= $langs->trans("DepositsAreIncluded"); + $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); + report_header($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => '')); + + print ''; + + print ''; + + print ' + '; + + /* + * Show result array + */ + print '

'; + + $i = 0; + print ""; + print ""; + // /print ""; + print ""; + print ""; + print ""; + print ""; + print "\n"; + + $var = true; + $r = ''; + + $invoicestatic = new FactureFournisseur($db); + $companystatic = new Fournisseur($db); + + foreach ( $tabfac as $key => $val ) { + $invoicestatic->id = $key; + $invoicestatic->ref = $val["ref"]; + $invoicestatic->type = $val["type"]; + $invoicestatic->description = html_entity_decode(dol_trunc($val["description"], 32)); + + $date = dol_print_date($db->jdate($val["date"]), 'day'); + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + print ""; + // print ""; + print ""; + print ""; + print ""; + print ""; + print '"; + print '"; + print ""; + } + } + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + print ""; + // print ""; + print ""; + print ""; + print ""; + print '"; + print '"; + print ""; + } + } + print ""; + + // Third party + // print ""; + print ""; + print ""; + + foreach ( $tabttc[$key] as $k => $mt ) { + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + + print ""; + print '"; + print '"; + } + print ""; + + $var = ! $var; + } + + print "
".$langs->trans("JournalNum")."" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("Account") . "" . $langs->trans("Type") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
".$conf->global->COMPTA_JOURNAL_BUY."" . $date . "" . $invoicestatic->getNomUrl(1) . "" . length_accountg($k) . "" . $invoicestatic->description . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
".$conf->global->COMPTA_JOURNAL_BUY."" . $date . "" . $invoicestatic->getNomUrl(1) . "" . length_accountg($k) . "" . $langs->trans("VAT") . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
".$conf->global->COMPTA_JOURNAL_BUY."" . $date . "" . $invoicestatic->getNomUrl(1) . "" . length_accounta($k); + print "" . $langs->trans("ThirdParty"); + print ' (' . $companystatic->getNomUrl(0, 'supplier', 16) . ')'; + print "' . ($mt < 0 ? - price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
"; + + // End of page + llxFooter(); +} +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php new file mode 100644 index 00000000000..587a0d387a4 --- /dev/null +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -0,0 +1,479 @@ + + * Copyright (C) 2007-2010 Jean Heimburger + * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2012 Regis Houssin + * Copyright (C) 2013 Christophe Battarel + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Olivier Geffroy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/journal/sellsjournal.php + * \ingroup Accounting Expert + * \brief Page with sells journal + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +$date_startmonth = GETPOST('date_startmonth'); +$date_startday = GETPOST('date_startday'); +$date_startyear = GETPOST('date_startyear'); +$date_endmonth = GETPOST('date_endmonth'); +$date_endday = GETPOST('date_endday'); +$date_endyear = GETPOST('date_endyear'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$action = GETPOST('action'); + +/* + * View + */ + +$year_current = strftime("%Y", dol_now()); +$pastmonth = strftime("%m", dol_now()) - 1; +$pastmonthyear = $year_current; +if ($pastmonth == 0) { + $pastmonth = 12; + $pastmonthyear --; +} + +$date_start = dol_mktime(0, 0, 0, $date_startmonth, $date_startday, $date_startyear); +$date_end = dol_mktime(23, 59, 59, $date_endmonth, $date_endday, $date_endyear); + +if (empty($date_start) || empty($date_end)) // We define date_start and date_end +{ + $date_start = dol_get_first_day($pastmonthyear, $pastmonth, false); + $date_end = dol_get_last_day($pastmonthyear, $pastmonth, false); +} + +$p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY); +$idpays = $p[0]; + +$sql = "SELECT f.rowid, f.facnumber, f.type, f.datef as df, f.ref_client,"; +$sql .= " fd.rowid as fdid, fd.description, fd.product_type, fd.total_ht, fd.total_tva, fd.tva_tx, fd.total_ttc,"; +$sql .= " s.rowid as socid, s.nom as name, s.code_compta, s.code_client,"; +$sql .= " p.rowid as pid, p.ref as pref, p.accountancy_code_sell, aa.rowid as fk_compte, aa.account_number as compte, aa.label as label_compte, "; +$sql .= " ct.accountancy_code_sell as account_tva"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facturedet fd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product p ON p.rowid = fd.fk_product"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount aa ON aa.rowid = fd.fk_code_ventilation"; +$sql .= " JOIN " . MAIN_DB_PREFIX . "facture f ON f.rowid = fd.fk_facture"; +$sql .= " JOIN " . MAIN_DB_PREFIX . "societe s ON s.rowid = f.fk_soc"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_tva ct ON fd.tva_tx = ct.taux AND ct.fk_pays = '" . $idpays . "'"; +$sql .= " WHERE fd.fk_code_ventilation > 0 "; +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = " . $conf->entity; +} +$sql .= " AND f.fk_statut > 0"; +if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) + $sql .= " AND f.type IN (0,1,2)"; +else + $sql .= " AND f.type IN (0,1,2,3)"; +$sql .= " AND fd.product_type IN (0,1)"; +if ($date_start && $date_end) + $sql .= " AND f.datef >= '" . $db->idate($date_start) . "' AND f.datef <= '" . $db->idate($date_end) . "'"; +$sql .= " ORDER BY f.datef"; + +dol_syslog('accountancy/journal/sellsjournal.php:: $sql=' . $sql); +$result = $db->query($sql); +if ($result) { + $tabfac = array (); + $tabht = array (); + $tabtva = array (); + $tabttc = array (); + $tabcompany = array (); + + $num = $db->num_rows($result); + $i = 0; + + while ( $i < $num ) { + $obj = $db->fetch_object($result); + // les variables + $cptcli = (! empty($conf->global->COMPTA_ACCOUNT_CUSTOMER)) ? $conf->global->COMPTA_ACCOUNT_CUSTOMER : $langs->trans("CodeNotDef"); + $compta_soc = (! empty($obj->code_compta)) ? $obj->code_compta : $cptcli; + + $compta_prod = $obj->compte; + if (empty($compta_prod)) { + if ($obj->product_type == 0) + $compta_prod = (! empty($conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT)) ? $conf->global->COMPTA_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef"); + else + $compta_prod = (! empty($conf->global->COMPTA_SERVICE_SOLD_ACCOUNT)) ? $conf->global->COMPTA_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef"); + } + $cpttva = (! empty($conf->global->COMPTA_VAT_ACCOUNT)) ? $conf->global->COMPTA_VAT_ACCOUNT : $langs->trans("CodeNotDef"); + $compta_tva = (! empty($obj->account_tva) ? $obj->account_tva : $cpttva); + + // Invoice lines + $tabfac[$obj->rowid]["date"] = $obj->df; + $tabfac[$obj->rowid]["ref"] = $obj->facnumber; + $tabfac[$obj->rowid]["type"] = $obj->type; + $tabfac[$obj->rowid]["description"] = $obj->description; + $tabfac[$obj->rowid]["fk_facturedet"] = $obj->fdid; + if (! isset($tabttc[$obj->rowid][$compta_soc])) + $tabttc[$obj->rowid][$compta_soc] = 0; + if (! isset($tabht[$obj->rowid][$compta_prod])) + $tabht[$obj->rowid][$compta_prod] = 0; + if (! isset($tabtva[$obj->rowid][$compta_tva])) + $tabtva[$obj->rowid][$compta_tva] = 0; + $tabttc[$obj->rowid][$compta_soc] += $obj->total_ttc; + $tabht[$obj->rowid][$compta_prod] += $obj->total_ht; + $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva; + $tabcompany[$obj->rowid] = array ( + 'id' => $obj->socid, + 'name' => $obj->name, + 'code_client' => $obj->code_compta + ); + + $i ++; + } +} else { + dol_print_error($db); +} + +/* + * Action + */ + +// Bookkeeping Write +if ($action == 'writebookkeeping') { + $now = dol_now(); + + foreach ( $tabfac as $key => $val ) { + foreach ( $tabttc[$key] as $k => $mt ) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_create = $now; + $bookkeeping->doc_type = 'customer_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_facturedet"]; + $bookkeeping->code_tiers = $tabcompany[$key]['code_client']; + $bookkeeping->numero_compte = $conf->global->COMPTA_ACCOUNT_CUSTOMER; + $bookkeeping->label_compte = $tabcompany[$key]['name']; + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt >= 0) ? $mt : 0; + $bookkeeping->credit = ($mt < 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_SELL_JOURNAL; + + $bookkeeping->create(); + } + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + // get compte id and label + $compte = new AccountingAccount($db); + if ($compte->fetch(null, $k)) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_create = $now; + $bookkeeping->doc_type = 'customer_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_facturedet"]; + $bookkeeping->code_tiers = ''; + $bookkeeping->numero_compte = $k; + $bookkeeping->label_compte = dol_trunc($val["description"], 128); + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt < 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt < 0) ? $mt : 0; + $bookkeeping->credit = ($mt >= 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_SELL_JOURNAL; + + $bookkeeping->create(); + } + } + } + + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + $bookkeeping = new BookKeeping($db); + $bookkeeping->doc_date = $val["date"]; + $bookkeeping->doc_ref = $val["ref"]; + $bookkeeping->date_create = $now; + $bookkeeping->doc_type = 'customer_invoice'; + $bookkeeping->fk_doc = $key; + $bookkeeping->fk_docdet = $val["fk_facturedet"]; + $bookkeeping->fk_compte = $compte->id; + $bookkeeping->code_tiers = ''; + $bookkeeping->numero_compte = $k; + $bookkeeping->label_compte = $langs->trans("VAT"); + $bookkeeping->montant = $mt; + $bookkeeping->sens = ($mt < 0) ? 'D' : 'C'; + $bookkeeping->debit = ($mt < 0) ? $mt : 0; + $bookkeeping->credit = ($mt >= 0) ? $mt : 0; + $bookkeeping->code_journal = $conf->global->ACCOUNTING_SELL_JOURNAL; + + $bookkeeping->create(); + } + } + } +} +// export csv +if ($action == 'export_csv') { + $sep = $conf->global->ACCOUNTING_SEPARATORCSV; + + header('Content-Type: text/csv'); + header('Content-Disposition: attachment;filename=journal_ventes.csv'); + + $companystatic = new Client($db); + + if ($conf->global->ACCOUNTING_MODELCSV == 1) // Modèle Export Cegid Expert + { + foreach ( $tabfac as $key => $val ) { + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + + $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); + + print $date . $sep; + print $conf->global->ACCOUNTING_SELL_JOURNAL . $sep; + print length_accountg($conf->global->COMPTA_ACCOUNT_CUSTOMER) . $sep; + foreach ( $tabttc[$key] as $k => $mt ) { + print length_accounta(html_entity_decode($k)) . $sep; + print ($mt < 0 ? 'C' : 'D') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print utf8_decode($companystatic->name) . $sep; + } + print $val["ref"]; + print "\n"; + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + print $date . $sep; + print $conf->global->ACCOUNTING_SELL_JOURNAL . $sep; + print length_accountg(html_entity_decode($k)) . $sep; + print $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print dol_trunc($val["description"], 32) . $sep; + print $val["ref"]; + print "\n"; + } + } + // TVA + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + print $date . $sep; + print $conf->global->ACCOUNTING_SELL_JOURNAL . $sep; + print length_accountg(html_entity_decode($k)) . $sep; + print $sep; + print ($mt < 0 ? 'D' : 'C') . $sep; + print ($mt <= 0 ? price(- $mt) : $mt) . $sep; + print $langs->trans("VAT") . $sep; + print $val["ref"]; + print "\n"; + } + } + } + } else // Modèle Export Classique + { + foreach ( $tabfac as $key => $val ) { + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + + $date = dol_print_date($db->jdate($val["date"]), 'day'); + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + foreach ( $tabttc[$key] as $k => $mt ) { + print '"' . length_accounta(html_entity_decode($k)) . '"' . $sep; + print '"' . utf8_decode($companystatic->name) . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"'; + } + print "\n"; + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; + print '"' . dol_trunc($val["description"], 32) . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + print "\n"; + } + } + + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + print '"' . $date . '"' . $sep; + print '"' . $val["ref"] . '"' . $sep; + print '"' . length_accountg(html_entity_decode($k)) . '"' . $sep; + print '"' . $langs->trans("VAT") . '"' . $sep; + print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; + print '"' . ($mt >= 0 ? price($mt) : '') . '"'; + print "\n"; + } + } + } + } +} else { + + $form = new Form($db); + + llxHeader('', $langs->trans("SellsJournal")); + + $nom = $langs->trans("SellsJournal"); + $nomlink = ''; + $periodlink = ''; + $exportlink = ''; + $builddate = time(); + $description = $langs->trans("DescSellsJournal") . '
'; + if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) + $description .= $langs->trans("DepositsAreNotIncluded"); + else + $description .= $langs->trans("DepositsAreIncluded"); + $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); + report_header($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => '')); + + print ''; + + print ''; + + print ' + '; + + /* + * Show result array + */ + print '

'; + + $i = 0; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print "\n"; + + $var = true; + $r = ''; + + $invoicestatic = new Facture($db); + $companystatic = new Client($db); + + foreach ( $tabfac as $key => $val ) { + $invoicestatic->id = $key; + $invoicestatic->ref = $val["ref"]; + $invoicestatic->type = $val["type"]; + $invoicestatic->description = html_entity_decode(dol_trunc($val["description"], 32)); + + $date = dol_print_date($db->jdate($val["date"]), 'day'); + + print ""; + + // Third party + // print ""; + print ""; + print ""; + foreach ( $tabttc[$key] as $k => $mt ) { + $companystatic->id = $tabcompany[$key]['id']; + $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + print ""; + print ""; + } + print ""; + + // Product / Service + foreach ( $tabht[$key] as $k => $mt ) { + if ($mt) { + print ""; + // print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + } + } + + // VAT + // var_dump($tabtva); + foreach ( $tabtva[$key] as $k => $mt ) { + if ($mt) { + print ""; + // print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + } + } + + $var = ! $var; + } + + print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("Account") . "" . $langs->trans("Type") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
".$conf->global->COMPTA_JOURNAL_SELL."" . $date . "" . $invoicestatic->getNomUrl(1) . "" . length_accounta($k); + print "" . $langs->trans("ThirdParty"); + print ' (' . $companystatic->getNomUrl(0, 'customer', 16) . ')'; + print "" . ($mt >= 0 ? price($mt) : '') . "" . ($mt < 0 ? price(- $mt) : '') . "
".$conf->global->COMPTA_JOURNAL_SELL."" . $date . "" . $invoicestatic->getNomUrl(1) . "" . length_accountg($k) . "" . $invoicestatic->description . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
".$conf->global->COMPTA_JOURNAL_SELL."" . $date . "" . $invoicestatic->getNomUrl(1) . "" . length_accountg($k) . "" . $langs->trans("VAT") . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
"; + + // End of page + llxFooter(); +} +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/supplier/card.php b/htdocs/accountancy/supplier/card.php new file mode 100644 index 00000000000..3ff70b4e670 --- /dev/null +++ b/htdocs/accountancy/supplier/card.php @@ -0,0 +1,140 @@ + + * Copyright (C) 2005 Simon TOSSER + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/** + * \file htdocs/accountancy/supplier/card.php + * \ingroup Accounting Expert + * \brief Card supplier ventilation + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +$action = GETPOST('action'); +$id = GETPOST('id', 'int'); +$codeventil = GETPOST('codeventil'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +if ($action == 'ventil' && $user->rights->accounting->access) { + $sql = " UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det"; + $sql .= " SET fk_code_ventilation = " . $codeventil; + $sql .= " WHERE rowid = " . $id; + + dol_syslog('accountancy/journal/sellsjournal.php:: $sql=' . $sql); + + $resql = $db->query($sql); + if (! $resql) { + setEventMessage($db->lasterror(), 'errors'); + } +} + +/* + * View + */ +llxHeader("", "", "FicheVentilation"); + +if ($cancel == $langs->trans("Cancel")) { + $action = ''; +} + +/* + * Create + */ +$form = new Form($db); +$facturefournisseur_static = new FactureFournisseur($db); +$formventilation = new FormVentilation($db); + +if ($_GET["id"]) { + $sql = "SELECT f.ref as facnumber, f.rowid as facid, l.fk_product, l.description, l.rowid, l.fk_code_ventilation, "; + $sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label"; + $sql .= ", aa.account_number, aa.label"; + $sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn_det as l"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount as aa ON l.fk_code_ventilation = aa.rowid"; + $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facture_fourn as f ON f.rowid = l.fk_facture_fourn "; + $sql .= " WHERE f.fk_statut > 0 AND l.rowid = " . $id; + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; + } + + $result = $db->query($sql); + if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + + if ($num_lines) { + $objp = $db->fetch_object($result); + + print '
' . "\n"; + print ''; + print ''; + + print_fiche_titre($langs->trans("Ventilation")); + + print ''; + + // ref invoice + print ''; + $facturefournisseur_static->ref = $objp->facnumber; + $facturefournisseur_static->id = $objp->facid; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print '
' . $langs->trans("BillsSuppliers") . '' . $facturefournisseur_static->getNomUrl(1) . '
Ligne' . stripslashes(nl2br($objp->description)) . '
' . $langs->trans("ProductLabel") . '' . dol_trunc($objp->product_label, 24) . '
' . $langs->trans("Account") . ''; + print $objp->account_number . '-' . $objp->label; + print '
' . $langs->trans("NewAccount") . ''; + print $formventilation->select_account($objp->fk_code_ventilation, 'codeventil', 1); + print '
 
'; + print '
'; + } else { + print "Error 1"; + } + } else { + print "Error 2"; + } +} else { + print "Error ID incorrect"; +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/supplier/index.html b/htdocs/accountancy/supplier/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php new file mode 100644 index 00000000000..3136be313e6 --- /dev/null +++ b/htdocs/accountancy/supplier/index.php @@ -0,0 +1,260 @@ + + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2014 Alexandre Spangaro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/supplier/index.php + * \ingroup Accounting Expert + * \brief Page accueil ventilation + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +// Filter +$year = $_GET["year"]; +if ($year == 0) { + $year_current = strftime("%Y", time()); + $year_start = $year_current; +} else { + $year_current = $year; + $year_start = $year; +} + +// Validate History +$action = GETPOST('action'); +if ($action == 'validatehistory') { + + $error = 0; + $db->begin(); + + if ($db->type == 'pgsql') { + $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det as fd"; + $sql1 .= " SET fd.fk_code_ventilation = accnt.rowid"; + $sql1 .= " FROM " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accountingaccount as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; + $sql1 .= " WHERE fd.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . $conf->global->CHARTOFACCOUNTS; + $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_buy=accnt.account_number"; + $sql1 .= " AND fd.fk_code_ventilation = 0"; + } else { + $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det as fd, " . MAIN_DB_PREFIX . "product as p, " . MAIN_DB_PREFIX . "accountingaccount as accnt , " . MAIN_DB_PREFIX . "accounting_system as syst"; + $sql1 .= " SET fd.fk_code_ventilation = accnt.rowid"; + $sql1 .= " WHERE fd.fk_product = p.rowid AND accnt.fk_pcg_version = syst.pcg_version AND syst.rowid=" . $conf->global->CHARTOFACCOUNTS; + $sql1 .= " AND accnt.active = 1 AND p.accountancy_code_buy=accnt.account_number"; + $sql1 .= " AND fd.fk_code_ventilation = 0"; + } + + $resql1 = $db->query($sql1); + if (! $resql1) { + $error ++; + $db->rollback(); + setEventMessage($db->lasterror(), 'errors'); + } else { + $db->commit(); + setEventMessage($langs->trans('Dispatched'), 'mesgs'); + } +} + +/* + * View + */ + +llxHeader('', $langs->trans("SuppliersVentilation")); + +$textprevyear = "" . img_previous() . ""; +$textnextyear = " " . img_next() . ""; + +print_fiche_titre($langs->trans("VentilationComptableSupplier") . " " . $textprevyear . " " . $langs->trans("Year") . " " . $year_start . " " . $textnextyear); + +print '' . $langs->trans("DescVentilSupplier") . ''; +print ''; + +$y = $year_current; + +$var = true; + +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +$sql = "SELECT IF(aa.account_number IS NULL, 'Non pointe', aa.account_number) AS 'code comptable',"; +$sql .= " IF(aa.label IS NULL, 'Non pointe', aa.label) AS 'Intitulé',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=1,ffd.total_ht,0)),2) AS 'Janvier',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=2,ffd.total_ht,0)),2) AS 'Fevrier',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=3,ffd.total_ht,0)),2) AS 'Mars',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=4,ffd.total_ht,0)),2) AS 'Avril',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=5,ffd.total_ht,0)),2) AS 'Mai',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=6,ffd.total_ht,0)),2) AS 'Juin',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=7,ffd.total_ht,0)),2) AS 'Juillet',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=8,ffd.total_ht,0)),2) AS 'Aout',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=9,ffd.total_ht,0)),2) AS 'Septembre',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=10,ffd.total_ht,0)),2) AS 'Octobre',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=11,ffd.total_ht,0)),2) AS 'Novembre',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=12,ffd.total_ht,0)),2) AS 'Decembre',"; +$sql .= " ROUND(SUM(ffd.total_ht),2) as 'Total'"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn_det as ffd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture_fourn as ff ON ff.rowid = ffd.fk_facture_fourn"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount as aa ON aa.rowid = ffd.fk_code_ventilation"; +$sql .= " WHERE ff.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'"; +$sql .= " AND ff.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'"; +$sql .= " AND ff.fk_statut > 0 "; + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND ff.entity = '" . $conf->entity . "'"; +} + +$sql .= " GROUP BY ffd.fk_code_ventilation"; + +dol_syslog('/accountancy/supplier/index.php:: sql=' . $sql); +$resql = $db->query($sql); +if ($resql) { + $i = 0; + $num = $db->num_rows($resql); + + while ( $i < $num ) { + + $row = $db->fetch_row($resql); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + $i ++; + } + $db->free($resql); +} else { + print $db->lasterror(); // Show last sql error +} +print "
' . $langs->trans("Account") . '' . $langs->trans("Intitule") . '' . $langs->trans("JanuaryMin") . '' . $langs->trans("FebruaryMin") . '' . $langs->trans("MarchMin") . '' . $langs->trans("AprilMin") . '' . $langs->trans("MayMin") . '' . $langs->trans("JuneMin") . '' . $langs->trans("JulyMin") . '' . $langs->trans("AugustMin") . '' . $langs->trans("SeptemberMin") . '' . $langs->trans("OctoberMin") . '' . $langs->trans("NovemberMin") . '' . $langs->trans("DecemberMin") . '' . $langs->trans("Total") . '
' . $row[0] . '' . $row[1] . '' . price($row[2]) . '' . price($row[3]) . '' . price($row[4]) . '' . price($row[5]) . '' . price($row[6]) . '' . price($row[7]) . '' . price($row[8]) . '' . price($row[9]) . '' . price($row[10]) . '' . price($row[11]) . '' . price($row[12]) . '' . price($row[13]) . '' . price($row[14]) . '
\n"; + +print "
\n"; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +$sql = "SELECT '" . $langs->trans("CAHTF") . "' AS 'Total',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=1,ffd.total_ht,0)),2) AS 'Janvier',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=2,ffd.total_ht,0)),2) AS 'Fevrier',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=3,ffd.total_ht,0)),2) AS 'Mars',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=4,ffd.total_ht,0)),2) AS 'Avril',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=5,ffd.total_ht,0)),2) AS 'Mai',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=6,ffd.total_ht,0)),2) AS 'Juin',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=7,ffd.total_ht,0)),2) AS 'Juillet',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=8,ffd.total_ht,0)),2) AS 'Aout',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=9,ffd.total_ht,0)),2) AS 'Septembre',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=10,ffd.total_ht,0)),2) AS 'Octobre',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=11,ffd.total_ht,0)),2) AS 'Novembre',"; +$sql .= " ROUND(SUM(IF(MONTH(ff.datef)=12,ffd.total_ht,0)),2) AS 'Decembre',"; +$sql .= " ROUND(SUM(ffd.total_ht),2) as 'Total'"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn_det as ffd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "facture_fourn as ff ON ff.rowid = ffd.fk_facture_fourn"; +$sql .= " WHERE ff.datef >= '" . $db->idate(dol_get_first_day($y, 1, false)) . "'"; +$sql .= " AND ff.datef <= '" . $db->idate(dol_get_last_day($y, 12, false)) . "'"; +$sql .= " AND ff.fk_statut > 0 "; + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND ff.entity = '" . $conf->entity . "'"; +} + +dol_syslog('/accountancy/supplier/index.php:: sql=' . $sql); +$resql = $db->query($sql); +if ($resql) { + $i = 0; + $num = $db->num_rows($resql); + + while ( $i < $num ) { + $row = $db->fetch_row($resql); + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $i ++; + } + + $db->free($resql); +} else { + print $db->lasterror(); // Show last sql error +} +print "
' . $langs->trans("Total") . '' . $langs->trans("JanuaryMin") . '' . $langs->trans("FebruaryMin") . '' . $langs->trans("MarchMin") . '' . $langs->trans("AprilMin") . '' . $langs->trans("MayMin") . '' . $langs->trans("JuneMin") . '' . $langs->trans("JulyMin") . '' . $langs->trans("AugustMin") . '' . $langs->trans("SeptemberMin") . '' . $langs->trans("OctoberMin") . '' . $langs->trans("NovemberMin") . '' . $langs->trans("DecemberMin") . '' . $langs->trans("Total") . '
' . $row[0] . '' . $row[1] . '' . price($row[2]) . '' . price($row[3]) . '' . price($row[4]) . '' . price($row[5]) . '' . price($row[6]) . '' . price($row[7]) . '' . price($row[8]) . '' . price($row[9]) . '' . price($row[10]) . '' . price($row[11]) . '' . price($row[12]) . '' . price($row[13]) . '
\n"; + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php new file mode 100644 index 00000000000..41ab92aa765 --- /dev/null +++ b/htdocs/accountancy/supplier/lines.php @@ -0,0 +1,223 @@ + + * Copyright (C) 2005 Simon TOSSER + * Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Ari Elbaz (elarifr) + * Copyright (C) 2013-2014 Florian Henry a + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/supplier/lines.php + * \ingroup Accounting Expert + * \brief Page of detail of the lines of ventilation of invoices suppliers + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$formventilation = new FormVentilation($db); + +$changeaccount = GETPOST('changeaccount'); + +$is_search = GETPOST('button_search_x'); + +if (is_array($changeaccount) && count($changeaccount) > 0 && empty($is_search)) { + $error = 0; + + $db->begin(); + + $sql1 = "UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det as l"; + $sql1 .= " SET l.fk_code_ventilation=" . GETPOST('account_parent'); + $sql1 .= ' WHERE l.rowid IN (' . implode(',', $changeaccount) . ')'; + + dol_syslog('accountancy/supplier/lines.php::changeaccount sql= ' . $sql1); + $resql1 = $db->query($sql1); + if (! $resql1) { + $error ++; + setEventMessage($db->lasterror(), 'errors'); + } + if (! $error) { + $db->commit(); + setEventMessage($langs->trans('Save'), 'mesgs'); + } else { + $db->rollback(); + setEventMessage($db->lasterror(), 'errors'); + } +} + +/* + * View + */ + +llxHeader('', $langs->trans("SuppliersVentilation") . ' - ' . $langs->trans("Dispatched")); + +$page = $_GET["page"]; +if ($page < 0) + $page = 0; + +if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) { + $limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION; +} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) { + $limit = $conf->liste_limit; +} else { + $limit = $conf->liste_limit; +} + +$offset = $limit * $page; + +$sql = "SELECT f.ref as facnumber, f.rowid as facid, l.fk_product, l.description, l.total_ht , l.qty, l.rowid, l.tva_tx, aa.label, aa.account_number, "; +$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn as f"; +$sql .= " , " . MAIN_DB_PREFIX . "accountingaccount as aa"; +$sql .= " , " . MAIN_DB_PREFIX . "facture_fourn_det as l"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product"; +$sql .= " WHERE f.rowid = l.fk_facture_fourn and f.fk_statut >= 1 AND l.fk_code_ventilation <> 0 "; +$sql .= " AND aa.rowid = l.fk_code_ventilation"; +if (strlen(trim($_GET["search_facture"]))) { + $sql .= " AND f.facnumber like '%" . $_GET["search_facture"] . "%'"; +} +if (strlen(trim($_GET["search_ref"]))) { + $sql .= " AND p.ref like '%" . $_GET["search_ref"] . "%'"; +} +if (strlen(trim($_GET["search_label"]))) { + $sql .= " AND p.label like '%" . $_GET["search_label"] . "%'"; +} +if (strlen(trim($_GET["search_desc"]))) { + $sql .= " AND l.description like '%" . $_GET["search_desc"] . "%'"; +} +if (strlen(trim($_GET["search_account"]))) { + $sql .= " AND aa.account_number like '%" . $_GET["search_account"] . "%'"; +} +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; +} + +$sql .= " ORDER BY l.rowid"; +if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE > 0) { + $sql .= " DESC "; +} +$sql .= $db->plimit($limit + 1, $offset); + +dol_syslog('accountancy/supplier/lines.php::list sql= ' . $sql1); +$result = $db->query($sql); + +if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + + // TODO : print_barre_liste always use $conf->liste_limit and do not care about custom limit in list... + print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines); + + print '' . $langs->trans("DescVentilDoneSupplier") . ''; + + print '
'; + print ''; + + print '

'. $langs->trans("ChangeAccount"); + print $formventilation->select_account(GETPOST('account_parent'), 'account_parent', 1); + print '
'; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + $facturefournisseur_static = new FactureFournisseur($db); + $product_static = new Product($db); + + $var = True; + while ( $i < min($num_lines, $limit) ) { + $objp = $db->fetch_object($result); + $var = ! $var; + $codeCompta = $objp->account_number . ' ' . $objp->label; + + print ""; + + // Ref Invoice + $facturefournisseur_static->ref = $objp->facnumber; + $facturefournisseur_static->id = $objp->facid; + print ''; + + // Ref Product + $product_static->ref = $objp->product_ref; + $product_static->id = $objp->product_id; + $product_static->type = $objp->type; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + + print ""; + $i ++; + } +} else { + print $db->error(); +} + +print "
' . $langs->trans("Invoice") . '' . $langs->trans("Ref") . '' . $langs->trans("Label") . '' . $langs->trans("Description") . '' . $langs->trans("Amount") . '' . $langs->trans("Account") . '  
  '; + print ''; + print ' 
' . $facturefournisseur_static->getNomUrl(1) . ''; + if ($product_static->id) + print $product_static->getNomUrl(1); + else + print ' '; + print '' . dol_trunc($objp->product_label, 24) . '' . nl2br(dol_trunc($objp->description, 32)) . '' . price($objp->total_ht) . '' . $codeCompta . '' . $objp->rowid . ''; + print img_edit(); + print '
"; + +$db->close(); +llxFooter(); \ No newline at end of file diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php new file mode 100644 index 00000000000..84f548344b8 --- /dev/null +++ b/htdocs/accountancy/supplier/list.php @@ -0,0 +1,218 @@ + + * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2014 Ari Elbaz (elarifr) + * Copyright (C) 2013-2014 Florian Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/accountancy/supplier/list.php + * \ingroup Accounting Expert + * \brief Page de ventilation des lignes de facture + */ + +require '../../main.inc.php'; + +// Class +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; + +// Langs +$langs->load("compta"); +$langs->load("bills"); +$langs->load("other"); +$langs->load("main"); +$langs->load("accountancy"); + +$action = GETPOST('action'); +$codeventil = GETPOST('codeventil', 'array'); +$mesCasesCochees = GETPOST('mesCasesCochees', 'array'); + +// Security check +if ($user->societe_id > 0) + accessforbidden(); +if (! $user->rights->accounting->access) + accessforbidden(); + +$formventilation = new FormVentilation($db); + +llxHeader('', $langs->trans("Ventilation")); + +/* + * Action + */ + +if ($action == 'ventil') { + print '
' . $langs->trans("Processing") . '...
'; + if ($_POST['codeventil'] && $_POST["mesCasesCochees"]) { + print '
' . count($_POST["mesCasesCochees"]) . ' ' . $langs->trans("SelectedLines") . '
'; + $mesCodesVentilChoisis = $codeventil; + $cpt = 0; + + foreach ( $mesCasesCochees as $maLigneCochee ) { + // print '
id selectionnee : '.$monChoix."
"; + $maLigneCourante = split("_", $maLigneCochee); + $monId = $maLigneCourante[0]; + $monNumLigne = $maLigneCourante[1]; + $monCompte = $mesCodesVentilChoisis[$monNumLigne]; + + $sql = " UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det"; + $sql .= " SET fk_code_ventilation = " . $monCompte; + $sql .= " WHERE rowid = " . $monId; + + dol_syslog('accountancy/supplier/list.php:: sql=' . $sql); + if ($db->query($sql)) { + print '
' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' ' . $langs->trans("VentilatedinAccount") . ' : ' . $monCompte . '
'; + } else { + print '
' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' ' . $langs->trans("NotVentilatedinAccount") . ' : ' . $monCompte . '
' . $sql . '
'; + } + + $cpt ++; + } + } else { + print '
' . $langs->trans("AnyLineVentilate") . '
'; + } + print '
' . $langs->trans("EndProcessing") . '
'; +} + +/* + * Supplier Invoice Lines + * + */ +$page = GETPOST('page'); +if ($page < 0) + $page = 0; + +if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) { + $limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION; +} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) { + $limit = $conf->liste_limit; +} else { + $limit = $conf->liste_limit; +} + +$offset = $limit * $page; + +$sql = "SELECT f.ref, f.rowid as facid, f.ref_supplier, l.fk_product, l.description, l.total_ht as price, l.rowid, l.fk_code_ventilation, "; +$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.accountancy_code_buy as code_buy"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture_fourn as f"; +$sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facture_fourn_det as l ON f.rowid = l.fk_facture_fourn"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accountingaccount as aa ON p.accountancy_code_buy = aa.account_number"; +$sql .= " WHERE f.fk_statut > 0 AND fk_code_ventilation = 0"; + +if (! empty($conf->multicompany->enabled)) { + $sql .= " AND f.entity = '" . $conf->entity . "'"; +} + +$sql .= " ORDER BY l.rowid"; +if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) { + $sql .= " DESC "; +} +$sql .= $db->plimit($limit + 1, $offset); + +dol_syslog('accountancy/supplier/list.php:: $sql=' . $sql); +$result = $db->query($sql); +if ($result) { + $num_lines = $db->num_rows($result); + $i = 0; + + // TODO : print_barre_liste always use $conf->liste_limit and do not care about custom limit in list... + print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines); + + print '
' . $langs->trans("DescVentilTodoSupplier") . '
'; + + print '
' . "\n"; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + $facturefourn_static = new FactureFournisseur($db); + $productfourn_static = new ProductFournisseur($db); + $form = new Form($db); + + $var = True; + while ( $i < min($num_lines, $limit) ) { + $objp = $db->fetch_object($result); + $var = ! $var; + print ""; + + // Ref facture + $facturefourn_static->ref = $objp->ref; + $facturefourn_static->id = $objp->facid; + print ''; + + // Ref facture supplier + $productfourn_static->ref = $objp->product_ref; + $productfourn_static->id = $objp->product_id; + $productfourn_static->type = $objp->type; + print ''; + + // print ''; + + // print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + // Colonne choix du compte + print ''; + // Colonne choix ligne a ventiler + print ''; + + print ""; + $i ++; + } + + print ''; + + print "
Facture' . $langs->trans("Ref") . '' . $langs->trans("Label") . '' . $langs->trans("Description") . '' . $langs->trans("Amount") . '' . $langs->trans("Compte") . '' . $langs->trans("IntoAccount") . '' . $langs->trans("Ventilate") . '
' . $facturefourn_static->getNomUrl(1) . ''; + if ($productfourn_static->id) + print $productfourn_static->getNomUrl(1); + else + print ' '; + print ''.$objp->ref.''.$objp->ref_supplier.'' . dol_trunc($objp->product_label, 24) . '' . stripslashes(nl2br($objp->description)) . ''; + print price($objp->price); + print ''; + print $objp->code_buy; + print ''; + print $formventilation->select_account($objp->aarowid, 'codeventil[]', 1); + print ''; + print 'code_buy ? "checked" : "") . '/>'; + print '
 
"; + + print '
'; +} else { + print $db->error(); +} + +llxFooter(); +$db->close(); diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 5268018d2e9..ce3ad4905a7 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -425,7 +425,7 @@ class Adherent extends CommonObject $this->db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."adherent SET"; - $sql.= " civilite = ".(!is_null($this->civility_id)?"'".$this->civility_id."'":"null"); + $sql.= " civility = ".(!is_null($this->civility_id)?"'".$this->civility_id."'":"null"); $sql.= ", firstname = ".($this->firstname?"'".$this->db->escape($this->firstname)."'":"null"); $sql.= ", lastname=" .($this->lastname?"'".$this->db->escape($this->lastname)."'":"null"); $sql.= ", login=" .($this->login?"'".$this->db->escape($this->login)."'":"null"); @@ -1048,7 +1048,7 @@ class Adherent extends CommonObject { global $langs; - $sql = "SELECT d.rowid, d.ref_ext, d.civilite as civility_id, d.firstname, d.lastname, d.societe as company, d.fk_soc, d.statut, d.public, d.address, d.zip, d.town, d.note,"; + $sql = "SELECT d.rowid, d.ref_ext, d.civility as civility_id, d.firstname, d.lastname, d.societe as company, d.fk_soc, d.statut, d.public, d.address, d.zip, d.town, d.note,"; $sql.= " d.email, d.skype, d.phone, d.phone_perso, d.phone_mobile, d.login, d.pass,"; $sql.= " d.photo, d.fk_adherent_type, d.morphy, d.entity,"; $sql.= " d.datec as datec,"; @@ -1539,7 +1539,7 @@ class Adherent extends CommonObject $code=(empty($this->civility_id)?'':$this->civility_id); if (empty($code)) return ''; - return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civilite", "code", "civilite", $code); + return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civility", "code", "label", $code); } /** diff --git a/htdocs/admin/accounting.php b/htdocs/admin/accounting.php deleted file mode 100644 index 80f9a647125..00000000000 --- a/htdocs/admin/accounting.php +++ /dev/null @@ -1,260 +0,0 @@ - - * Copyright (C) 2004-2008 Laurent Destailleur - * Copyright (C) 2005-2009 Regis Houssin - * Copyright (C) 2011-2013 Juanjo Menent - * Copyright (C) 2011-2012 Alexandre Spangaro - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/admin/accounting.php - * \ingroup compta - * \brief Page to setup accountancy module - */ - -require '../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; - -$langs->load('admin'); -$langs->load('compta'); - -if (!$user->admin) -accessforbidden(); - -$action = GETPOST('action','alpha'); - -$compta_mode = defined('COMPTA_MODE')?COMPTA_MODE:'RECETTES-DEPENSES'; - -if ($action == 'setcomptamode') -{ - $compta_mode = GETPOST('compta_mode','alpha'); - - $res = dolibarr_set_const($db, 'COMPTA_MODE', $compta_mode,'chaine',0,'',$conf->entity); - - if (! $res > 0) $error++; - - if (! $error) - { - setEventMessage($langs->trans("SetupSaved")); - } - else - { - setEventMessage($langs->trans("Error"),'errors'); - } - -} - -if ($action == 'setchart') -{ - $chartofaccounts = GETPOST('chartofaccounts','alpha'); - - $res = dolibarr_set_const($db, 'CHARTOFACCOUNTS', $chartofaccounts,'chaine',0,'',$conf->entity); - - if (! $res > 0) $error++; - - if (! $error) - { - setEventMessage($langs->trans("SetupSaved")); - } - else - { - setEventMessage($langs->trans("Error"),'errors'); - } -} - -if ($action == 'update' || $action == 'add') -{ - $constname = GETPOST('constname','alpha'); - $constvalue = GETPOST('constvalue','alpha'); - $consttype = GETPOST('consttype','alpha'); - $constnote = GETPOST('constnote','alpha'); - - $res = dolibarr_set_const($db, $constname, $constvalue, $consttype, 0, $constnote, $conf->entity); - - if (! $res > 0) $error++; - - if (! $error) - { - setEventMessage($langs->trans("SetupSaved")); - } - else - { - setEventMessage($langs->trans("Error"),'errors'); - } -} - - -/*if ($action == 'delete') -{ - if (! dolibarr_del_const($db, $_GET['constname'],$conf->entity)); - { - print $db->error(); - } -}*/ - -/* - * Affichage page - */ - -llxHeader(); - -$form=new Form($db); - -$linkback=''.$langs->trans("BackToModuleList").''; -print_fiche_titre($langs->trans('ComptaSetup'),$linkback,'setup'); - - -print '
'; - -print ''; - -// Cas du parametre COMPTA_MODE -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print "\n"; -print ''; -print '\n"; -print ''; -print '\n"; -print ''; - -print "
'.$langs->trans('OptionMode').''.$langs->trans('Description').'
'.$langs->trans('OptionModeTrue').''.nl2br($langs->trans('OptionModeTrueDesc')); -// Write info on way to count VAT -if (! empty($conf->global->MAIN_MODULE_COMPTABILITE)) -{ - // print "
\n"; - // print nl2br($langs->trans('OptionModeTrueInfoModuleComptabilite')); -} -else -{ - // print "
\n"; - // print nl2br($langs->trans('OptionModeTrueInfoExpert')); -} -print "
'.$langs->trans('OptionModeVirtual').''.nl2br($langs->trans('OptionModeVirtualDesc'))."
\n"; - -/* - * Define Chart of accounts - * - */ -if (! empty($conf->global->ACCOUNTING_SELECTCHART) && ! empty($conf->accounting->enabled)) -{ - print '
'; - print_titre($langs->trans("Definechartofaccounts")); - - print '
'; - print ''; - - print ''; - $var=True; - - print ''; - print ''; - print ''; - print "\n"; - $var=!$var; - print ''; - print ""; - print ""; - print "
'; - print ''; - print $langs->trans("Chartofaccounts").'
".$langs->trans("Selectchartofaccounts").""; - print '"; - print "
"; - print "
"; -} - -print "
\n"; - -// Cas des autres parametres COMPTA_* -$list=array('COMPTA_PRODUCT_BUY_ACCOUNT','COMPTA_PRODUCT_SOLD_ACCOUNT','COMPTA_SERVICE_BUY_ACCOUNT','COMPTA_SERVICE_SOLD_ACCOUNT', -'COMPTA_VAT_ACCOUNT','COMPTA_ACCOUNT_CUSTOMER','COMPTA_ACCOUNT_SUPPLIER' -); - -$num=count($list); -if ($num) -{ - print ''; - print ''; - print ''; - print "\n"; -} - -foreach ($list as $key) -{ - $var=!$var; - - print ''; - print ''; - print ''; - print ''; - print ''; - - print ''; - - // Param - $libelle = $langs->trans($key); - print '\n"; - - // Value - print '\n"; - print ''; - - $i++; -} - -if ($num) -{ - print "
'.$langs->trans('OtherOptions').'
'.$libelle; - //print ' ('.$key.')'; - print "'; - print ''; - print ''; - print '   '; - print "
\n"; -} - -$db->close(); - -llxFooter(); diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index e81cf80a0fd..d9ebddf2b22 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -70,7 +70,7 @@ $hookmanager->initHooks(array('admin')); // Put here declaration of dictionaries properties // Sort order to show dictionary (0 is space). All other dictionaries (added by modules) will be at end of this. -$taborder=array(9,0,4,3,2,0,1,8,19,16,0,5,11,0,6,0,10,25,12,13,0,14,0,7,17,0,22,20,18,21,0,15,0,24,23,0,26); +$taborder=array(9,0,4,3,2,0,1,8,19,16,0,5,11,0,6,0,10,23,12,13,0,14,0,7,17,0,22,20,18,21,0,15,0,24); // Name of SQL tables of dictionaries $tabname=array(); @@ -78,7 +78,7 @@ $tabname[1] = MAIN_DB_PREFIX."c_forme_juridique"; $tabname[2] = MAIN_DB_PREFIX."c_departements"; $tabname[3] = MAIN_DB_PREFIX."c_regions"; $tabname[4] = MAIN_DB_PREFIX."c_country"; -$tabname[5] = MAIN_DB_PREFIX."c_civilite"; +$tabname[5] = MAIN_DB_PREFIX."c_civility"; $tabname[6] = MAIN_DB_PREFIX."c_actioncomm"; $tabname[7] = MAIN_DB_PREFIX."c_chargesociales"; $tabname[8] = MAIN_DB_PREFIX."c_typent"; @@ -96,10 +96,8 @@ $tabname[19]= MAIN_DB_PREFIX."c_effectif"; $tabname[20]= MAIN_DB_PREFIX."c_input_method"; $tabname[21]= MAIN_DB_PREFIX."c_availability"; $tabname[22]= MAIN_DB_PREFIX."c_input_reason"; -$tabname[23]= MAIN_DB_PREFIX."accountingaccount"; -$tabname[24]= MAIN_DB_PREFIX."accounting_system"; -$tabname[25]= MAIN_DB_PREFIX."c_revenuestamp"; -$tabname[26]= MAIN_DB_PREFIX."c_type_resource"; +$tabname[23]= MAIN_DB_PREFIX."c_revenuestamp"; +$tabname[24]= MAIN_DB_PREFIX."c_type_resource"; // Dictionary labels $tablib=array(); @@ -125,10 +123,8 @@ $tablib[19]= "DictionaryStaff"; $tablib[20]= "DictionaryOrderMethods"; $tablib[21]= "DictionaryAvailability"; $tablib[22]= "DictionarySource"; -$tablib[23]= "DictionaryAccountancyplan"; -$tablib[24]= "DictionaryAccountancysystem"; -$tablib[25]= "DictionaryRevenueStamp"; -$tablib[26]= "DictionaryResourceType"; +$tablib[23]= "DictionaryRevenueStamp"; +$tablib[24]= "DictionaryResourceType"; // Requests to extract data $tabsql=array(); @@ -136,7 +132,7 @@ $tabsql[1] = "SELECT f.rowid as rowid, f.code, f.libelle, c.code as country_code $tabsql[2] = "SELECT d.rowid as rowid, d.code_departement as code, d.nom as libelle, d.fk_region as region_id, r.nom as region, c.code as country_code, c.label as country, d.active FROM ".MAIN_DB_PREFIX."c_departements as d, ".MAIN_DB_PREFIX."c_regions as r, ".MAIN_DB_PREFIX."c_country as c WHERE d.fk_region=r.code_region and r.fk_pays=c.rowid and r.active=1 and c.active=1"; $tabsql[3] = "SELECT r.rowid as rowid, r.code_region as code, r.nom as libelle, r.fk_pays as country_id, c.code as country_code, c.label as country, r.active FROM ".MAIN_DB_PREFIX."c_regions as r, ".MAIN_DB_PREFIX."c_country as c WHERE r.fk_pays=c.rowid and c.active=1"; $tabsql[4] = "SELECT rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_country"; -$tabsql[5] = "SELECT c.rowid as rowid, c.code as code, c.civilite AS libelle, c.active FROM ".MAIN_DB_PREFIX."c_civilite AS c"; +$tabsql[5] = "SELECT c.rowid as rowid, c.code as code, c.label, c.active FROM ".MAIN_DB_PREFIX."c_civility AS c"; $tabsql[6] = "SELECT a.id as rowid, a.code as code, a.libelle AS libelle, a.type, a.active, a.module, a.position FROM ".MAIN_DB_PREFIX."c_actioncomm AS a"; $tabsql[7] = "SELECT a.id as rowid, a.code as code, a.libelle AS libelle, a.accountancy_code as accountancy_code, a.deductible, c.code as country_code, c.label as country, a.fk_pays as country_id, a.active FROM ".MAIN_DB_PREFIX."c_chargesociales AS a, ".MAIN_DB_PREFIX."c_country as c WHERE a.fk_pays=c.rowid and c.active=1"; $tabsql[8] = "SELECT t.id as rowid, t.code as code, t.libelle, t.fk_country as country_id, c.code as country_code, c.label as country, t.active FROM ".MAIN_DB_PREFIX."c_typent as t LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON t.fk_country=c.rowid"; @@ -154,10 +150,8 @@ $tabsql[19]= "SELECT id as rowid, code, libelle, active FROM ".MAIN_DB_PREF $tabsql[20]= "SELECT rowid as rowid, code, libelle, active FROM ".MAIN_DB_PREFIX."c_input_method"; $tabsql[21]= "SELECT c.rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_availability AS c"; $tabsql[22]= "SELECT rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_input_reason"; -$tabsql[23]= "SELECT rowid as rowid, fk_pcg_version, pcg_type, pcg_subtype, account_number as accountancy_code, account_parent, label, active FROM ".MAIN_DB_PREFIX."accountingaccount"; -$tabsql[24]= "SELECT s.rowid as rowid, pcg_version, s.fk_pays as country_id, c.code as country_code, c.label as country, s.label, s.active FROM ".MAIN_DB_PREFIX."accounting_system as s, ".MAIN_DB_PREFIX."c_country as c WHERE s.fk_pays=c.rowid and c.active=1"; -$tabsql[25]= "SELECT t.rowid, t.taux, c.label as country, c.code as country_code, t.fk_pays as country_id, t.note, t.active, t.accountancy_code_sell, t.accountancy_code_buy FROM ".MAIN_DB_PREFIX."c_revenuestamp as t, ".MAIN_DB_PREFIX."c_country as c WHERE t.fk_pays=c.rowid"; -$tabsql[26]= "SELECT rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_type_resource"; +$tabsql[23]= "SELECT t.rowid, t.taux, c.label as country, c.code as country_code, t.fk_pays as country_id, t.note, t.active, t.accountancy_code_sell, t.accountancy_code_buy FROM ".MAIN_DB_PREFIX."c_revenuestamp as t, ".MAIN_DB_PREFIX."c_country as c WHERE t.fk_pays=c.rowid"; +$tabsql[24]= "SELECT rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_type_resource"; // Criteria to sort dictionaries $tabsqlsort=array(); @@ -165,7 +159,7 @@ $tabsqlsort[1] ="country ASC, code ASC"; $tabsqlsort[2] ="country ASC, code ASC"; $tabsqlsort[3] ="country ASC, code ASC"; $tabsqlsort[4] ="code ASC"; -$tabsqlsort[5] ="libelle ASC"; +$tabsqlsort[5] ="label ASC"; $tabsqlsort[6] ="a.type ASC, a.module ASC, a.position ASC, a.code ASC"; $tabsqlsort[7] ="country ASC, code ASC, a.libelle ASC"; $tabsqlsort[8] ="country DESC, libelle ASC"; @@ -183,10 +177,8 @@ $tabsqlsort[19]="id ASC"; $tabsqlsort[20]="code ASC, libelle ASC"; $tabsqlsort[21]="code ASC, label ASC"; $tabsqlsort[22]="code ASC, label ASC"; -$tabsqlsort[23]="fk_pcg_version ASC, accountancy_code ASC"; -$tabsqlsort[24]="pcg_version ASC"; -$tabsqlsort[25]="country ASC, taux ASC"; -$tabsqlsort[26]="code ASC,label ASC"; +$tabsqlsort[23]="country ASC, taux ASC"; +$tabsqlsort[24]="code ASC,label ASC"; // Nom des champs en resultat de select pour affichage du dictionnaire $tabfield=array(); @@ -194,7 +186,7 @@ $tabfield[1] = "code,libelle,country"; $tabfield[2] = "code,libelle,region_id,region,country"; // "code,libelle,region,country_code-country" $tabfield[3] = "code,libelle,country_id,country"; $tabfield[4] = "code,label"; -$tabfield[5] = "code,libelle"; +$tabfield[5] = "code,label"; $tabfield[6] = "code,libelle,type,position"; $tabfield[7] = "code,libelle,country_id,country,accountancy_code,deductible"; $tabfield[8] = "code,libelle,country_id,country"; @@ -212,10 +204,8 @@ $tabfield[19]= "code,libelle"; $tabfield[20]= "code,libelle"; $tabfield[21]= "code,label"; $tabfield[22]= "code,label"; -$tabfield[23]= "fk_pcg_version,accountancy_code,account_parent,pcg_type,pcg_subtype,label"; -$tabfield[24]= "pcg_version,country_id,country,label"; -$tabfield[25]= "country_id,country,taux,accountancy_code_sell,accountancy_code_buy,note"; -$tabfield[26]= "code,label"; +$tabfield[23]= "country_id,country,taux,accountancy_code_sell,accountancy_code_buy,note"; +$tabfield[24]= "code,label"; // Nom des champs d'edition pour modification d'un enregistrement $tabfieldvalue=array(); @@ -223,7 +213,7 @@ $tabfieldvalue[1] = "code,libelle,country"; $tabfieldvalue[2] = "code,libelle,region"; // "code,libelle,region" $tabfieldvalue[3] = "code,libelle,country"; $tabfieldvalue[4] = "code,label"; -$tabfieldvalue[5] = "code,libelle"; +$tabfieldvalue[5] = "code,label"; $tabfieldvalue[6] = "code,libelle,type,position"; $tabfieldvalue[7] = "code,libelle,country,accountancy_code,deductible"; $tabfieldvalue[8] = "code,libelle,country"; @@ -241,10 +231,8 @@ $tabfieldvalue[19]= "code,libelle"; $tabfieldvalue[20]= "code,libelle"; $tabfieldvalue[21]= "code,label"; $tabfieldvalue[22]= "code,label"; -$tabfieldvalue[23]= "fk_pcg_version,accountancy_code,account_parent,pcg_type,pcg_subtype,label"; -$tabfieldvalue[24]= "pcg_version,country,label"; -$tabfieldvalue[25]= "country,taux,accountancy_code_sell,accountancy_code_buy,note"; -$tabfieldvalue[26]= "code,label"; +$tabfieldvalue[23]= "country,taux,accountancy_code_sell,accountancy_code_buy,note"; +$tabfieldvalue[24]= "code,label"; // Nom des champs dans la table pour insertion d'un enregistrement $tabfieldinsert=array(); @@ -252,7 +240,7 @@ $tabfieldinsert[1] = "code,libelle,fk_pays"; $tabfieldinsert[2] = "code_departement,nom,fk_region"; $tabfieldinsert[3] = "code_region,nom,fk_pays"; $tabfieldinsert[4] = "code,label"; -$tabfieldinsert[5] = "code,civilite"; +$tabfieldinsert[5] = "code,label"; $tabfieldinsert[6] = "code,libelle,type,position"; $tabfieldinsert[7] = "code,libelle,fk_pays,accountancy_code,deductible"; $tabfieldinsert[8] = "code,libelle,fk_country"; @@ -270,10 +258,8 @@ $tabfieldinsert[19]= "code,libelle"; $tabfieldinsert[20]= "code,libelle"; $tabfieldinsert[21]= "code,label"; $tabfieldinsert[22]= "code,label"; -$tabfieldinsert[23]= "fk_pcg_version,account_number,account_parent,pcg_type,pcg_subtype,label"; -$tabfieldinsert[24]= "pcg_version,fk_pays,label"; -$tabfieldinsert[25]= "fk_pays,taux,accountancy_code_sell,accountancy_code_buy,note"; -$tabfieldinsert[26]= "code,label"; +$tabfieldinsert[23]= "fk_pays,taux,accountancy_code_sell,accountancy_code_buy,note"; +$tabfieldinsert[24]= "code,label"; // Nom du rowid si le champ n'est pas de type autoincrement // Example: "" if id field is "rowid" and has autoincrement on @@ -302,9 +288,7 @@ $tabrowid[20]= ""; $tabrowid[21]= "rowid"; $tabrowid[22]= "rowid"; $tabrowid[23]= ""; -$tabrowid[24]= ""; -$tabrowid[25]= ""; -$tabrowid[25]= ""; +$tabrowid[23]= ""; // Condition to show dictionary in setup page $tabcond=array(); @@ -330,10 +314,8 @@ $tabcond[19]= ! empty($conf->societe->enabled); $tabcond[20]= ! empty($conf->fournisseur->enabled); $tabcond[21]= ! empty($conf->propal->enabled); $tabcond[22]= (! empty($conf->commande->enabled) || ! empty($conf->propal->enabled)); -$tabcond[23]= (! empty($conf->global->ACCOUNTING_USEDICTTOEDIT) && ! empty($conf->accounting->enabled)); // The accountancy plan should be edited with specific pages. You can set ACCOUNTING_USEDICTTOEDIT to 1 if you want to use dictionary editor. -$tabcond[24]= (! empty($conf->global->ACCOUNTING_USEDICTTOEDIT) && ! empty($conf->accounting->enabled)); // The accountancy system should be edited with specific pages. You can set ACCOUNTING_USEDICTTOEDIT to 1 if you want to use dictionary editor. -$tabcond[25]= true; -$tabcond[26]= ! empty($conf->resource->enabled); +$tabcond[23]= true; +$tabcond[24]= ! empty($conf->resource->enabled); // List of help for fields $tabhelp=array(); @@ -361,8 +343,6 @@ $tabhelp[21] = array(); $tabhelp[22] = array(); $tabhelp[23] = array(); $tabhelp[24] = array(); -$tabhelp[25] = array(); -$tabhelp[26] = array(); // List of check for fields (NOT USED YET) $tabfieldcheck=array(); @@ -390,8 +370,6 @@ $tabfieldcheck[21] = array(); $tabfieldcheck[22] = array(); $tabfieldcheck[23] = array(); $tabfieldcheck[24] = array(); -$tabfieldcheck[25] = array(); -$tabfieldcheck[26] = array(); // Complete all arrays with entries found into modules complete_dictionary_with_modules($taborder,$tabname,$tablib,$tabsql,$tabsqlsort,$tabfield,$tabfieldvalue,$tabfieldinsert,$tabrowid,$tabcond,$tabhelp,$tabfieldcheck); @@ -409,17 +387,23 @@ if ($id == 11) $langs->load("bills"); $langs->load("interventions"); $elementList = array( - 'commande' => $langs->trans('Order'), + 'proposal' => $langs->trans('Proposal'), + 'order' => $langs->trans('Order'), + 'invoice' => $langs->trans('Bill'), 'invoice_supplier' => $langs->trans('SupplierBill'), 'order_supplier' => $langs->trans('SupplierOrder'), - 'contrat' => $langs->trans('Contract'), + 'intervention' => $langs->trans('InterventionCard'), + 'contract' => $langs->trans('Contract'), 'project' => $langs->trans('Project'), 'project_task' => $langs->trans('Task'), + 'agenda' => $langs->trans('Agenda'), + // old deprecated + 'contrat' => $langs->trans('Contract'), 'propal' => $langs->trans('Proposal'), + 'commande' => $langs->trans('Order'), 'facture' => $langs->trans('Bill'), 'facture_fourn' => $langs->trans('SupplierBill'), - 'fichinter' => $langs->trans('InterventionCard'), - 'agenda' => $langs->trans('Agenda') + 'fichinter' => $langs->trans('InterventionCard') ); if (! empty($conf->global->MAIN_SUPPORT_SHARED_CONTACT_BETWEEN_THIRDPARTIES)) $elementList["societe"] = $langs->trans('ThirdParty'); $sourceList = array( @@ -792,7 +776,10 @@ if ($id) if ($fieldlist[$field]=='localtax2') { $valuetoshow=$langs->trans("Rate")." 3";} if ($fieldlist[$field]=='organization') { $valuetoshow=$langs->trans("Organization"); } if ($fieldlist[$field]=='lang') { $valuetoshow=$langs->trans("Language"); } - if ($fieldlist[$field]=='type') { $valuetoshow=$langs->trans("Type"); } + if ($fieldlist[$field]=='type') { + if ($tabname[$id] == MAIN_DB_PREFIX."c_paiement") $valuetoshow=$form->textwithtooltip($langs->trans("Type"),$langs->trans("TypePaymentDesc"),2,1,img_help(1,'')); + else $valuetoshow=$langs->trans("Type"); + } if ($fieldlist[$field]=='code') { $valuetoshow=$langs->trans("Code"); } if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') { $valuetoshow=$langs->trans("Label")."*"; } if ($fieldlist[$field]=='libelle_facture') { $valuetoshow=$langs->trans("LabelOnDocuments")."*"; } @@ -1045,7 +1032,7 @@ if ($id) $key=$langs->trans(strtoupper($obj->code)); $valuetoshow=($key != strtoupper($obj->code)?$key:$obj->$fieldlist[$field]); } - else if ($fieldlist[$field]=='libelle' && $tabname[$id]==MAIN_DB_PREFIX.'c_civilite') { + else if ($fieldlist[$field]=='label' && $tabname[$id]==MAIN_DB_PREFIX.'c_civility') { $key=$langs->trans("Civility".strtoupper($obj->code)); $valuetoshow=($obj->code && $key != "Civility".strtoupper($obj->code)?$key:$obj->$fieldlist[$field]); } diff --git a/htdocs/admin/index.php b/htdocs/admin/index.php index bbedab346d1..043efc92059 100644 --- a/htdocs/admin/index.php +++ b/htdocs/admin/index.php @@ -25,6 +25,7 @@ require '../main.inc.php'; $langs->load("admin"); $langs->load("companies"); +$langs->load("accountancy"); if (!$user->admin) accessforbidden(); diff --git a/htdocs/admin/limits.php b/htdocs/admin/limits.php index 781bc24aa09..5896ffc5416 100644 --- a/htdocs/admin/limits.php +++ b/htdocs/admin/limits.php @@ -204,9 +204,9 @@ else // Add vat rates examples specific to country $vat_rates=array(); - $sql.="SELECT taux as vat_rate"; + $sql="SELECT taux as vat_rate"; $sql.=" FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; - $sql.=" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$mysoc->country_code."' AND taux != 0"; + $sql.=" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$mysoc->country_code."' AND t.taux <> 0"; $sql.=" ORDER BY t.taux ASC"; $resql=$db->query($sql); if ($resql) diff --git a/htdocs/admin/security_other.php b/htdocs/admin/security_other.php index 54bc933374c..8c65d1f3359 100644 --- a/htdocs/admin/security_other.php +++ b/htdocs/admin/security_other.php @@ -105,6 +105,13 @@ else if ($action == 'MAIN_ANTIVIRUS_PARAM') if (! dolibarr_set_const($db, "MAIN_ANTIVIRUS_PARAM", $_POST["MAIN_ANTIVIRUS_PARAM"],'chaine',0,'',$conf->entity)) dol_print_error($db); else setEventMessage($langs->trans("RecordModifiedSuccessfully")); } +else if ($action == 'MAIN_APPLICATION_TITLE') +{ + if (! dolibarr_set_const($db, "MAIN_APPLICATION_TITLE", $_POST["MAIN_SESSION_TIMEOUT"],'chaine',0,'',$conf->entity)) dol_print_error($db); + else setEventMessage($langs->trans("RecordModifiedSuccessfully")); +} + + // Delete file else if ($action == 'delete') @@ -163,8 +170,24 @@ print 'global->MAIN_APPLICATION_TITLE)) $conf->global->MAIN_APPLICATION_TITLE=""; +print '
'; +print ''; +print ''; +print ''.$langs->trans("HiddeNumVersion").''; +print $form->textwithpicto('',$langs->trans("HiddeNumVersionExample",ini_get("session.gc_probability"),ini_get("session.gc_divisor"))); +print ''; +print ''; +print ' '; +print ''; +print ''; +print ''; +print ''; +print '
'; +print ''; print '
'; @@ -333,6 +356,5 @@ $formfile->form_attach_new_file($_SERVER['PHP_SELF'], $langs->trans("FormToTestF $filearray=dol_dir_list($upload_dir, "files", 0, '', '', 'name', SORT_ASC, 1); $formfile->list_of_documents($filearray, '', 'admin_temp', ''); - llxFooter(); $db->close(); diff --git a/htdocs/cashdesk/affContenu.php b/htdocs/cashdesk/affContenu.php index ca471e0bdf4..543006baedf 100644 --- a/htdocs/cashdesk/affContenu.php +++ b/htdocs/cashdesk/affContenu.php @@ -55,6 +55,8 @@ print ''; print '
'; $page=GETPOST('menu','alpha'); +if (empty($page)) $page='facturation'; + if (in_array( $page, array( diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index f9c4a96dcaa..f7de102d96d 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -74,7 +74,7 @@ class Categorie extends CommonObject function fetch($id,$label='') { global $conf; - + // Check parameters if (empty($id) && empty($label)) return -1; @@ -1151,11 +1151,11 @@ class Categorie extends CommonObject $cats = array(); $typeid=-1; $table='';; - if ($type == '0' || $type == 'product') { $typeid=0; $table='product'; $type='product'; } + if ($type == '0' || $type == 'product') { $typeid=0; $table='product'; $type='product'; } else if ($type == '1' || $type == 'supplier') { $typeid=1; $table='societe'; $type='fournisseur'; } else if ($type == '2' || $type == 'customer') { $typeid=2; $table='societe'; $type='societe'; } else if ($type == '3' || $type == 'member') { $typeid=3; $table='member'; $type='member'; } - else if ($type == '4' || $type == 'contact') { $typeid=4; $table='socpeople'; $type='contact'; } + else if ($type == '4' || $type == 'contact') { $typeid=4; $table='socpeople'; $type='contact'; } $sql = "SELECT ct.fk_categorie, c.label"; $sql.= " FROM ".MAIN_DB_PREFIX."categorie_".$type." as ct, ".MAIN_DB_PREFIX."categorie as c"; diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 18bef50369d..7b9705c9429 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -140,6 +140,7 @@ class ActionComm extends CommonObject if ($result > 0) { $this->type_id=$cactioncomm->id; + $this->code=$cactioncomm->code; } else if ($result == 0) { diff --git a/htdocs/comm/action/fiche.php b/htdocs/comm/action/fiche.php index 6a11985aa6a..a12867c0800 100644 --- a/htdocs/comm/action/fiche.php +++ b/htdocs/comm/action/fiche.php @@ -55,6 +55,10 @@ $contactid=GETPOST('contactid','int'); $origin=GETPOST('origin','alpha'); $originid=GETPOST('originid','int'); +$fulldayevent=GETPOST('fullday'); +$datep=dol_mktime($fulldayevent?'00':GETPOST("aphour"), $fulldayevent?'00':GETPOST("apmin"), 0, GETPOST("apmonth"), GETPOST("apday"), GETPOST("apyear")); +$datef=dol_mktime($fulldayevent?'23':GETPOST("p2hour"), $fulldayevent?'59':GETPOST("p2min"), $fulldayevent?'59':'0', GETPOST("p2month"), GETPOST("p2day"), GETPOST("p2year")); + // Security check $socid = GETPOST('socid','int'); $id = GETPOST('id','int'); @@ -63,6 +67,7 @@ $result = restrictedArea($user, 'agenda', $id, 'actioncomm&societe', 'myactions| if ($user->societe_id && $socid) $result = restrictedArea($user,'societe',$socid); $error=GETPOST("error"); +$donotclearsession=0; $cactioncomm = new CActionComm($db); $object = new ActionComm($db); @@ -82,6 +87,19 @@ $hookmanager->initHooks(array('actioncard')); * Actions */ +if (GETPOST('addassignedtouser')) +{ + // Add a new user + if (GETPOST('affectedto') > 0) + { + $assignedtouser=array(); + if (!empty($_SESSION['assignedtouser'])) $assignedtouser=dol_json_decode($_SESSION['assignedtouser'], true); + $assignedtouser[GETPOST('affectedto')]=array('transparency'=>GETPOST('transparency'),'mandatory'=>1); + $_SESSION['assignedtouser']=dol_json_encode($assignedtouser); + } + $donotclearsession=1; + $action='create'; +} // Add action if ($action == 'add_action') { @@ -104,12 +122,11 @@ if ($action == 'add_action') exit; } - $fulldayevent=GETPOST('fullday'); $percentage=in_array(GETPOST('status'),array(-1,100))?GETPOST('status'):GETPOST("percentage"); // If status is -1 or 100, percentage is not defined and we must use status // Clean parameters - $datep=dol_mktime($fulldayevent?'00':$_POST["aphour"], $fulldayevent?'00':$_POST["apmin"], 0, $_POST["apmonth"], $_POST["apday"], $_POST["apyear"]); - $datef=dol_mktime($fulldayevent?'23':$_POST["p2hour"], $fulldayevent?'59':$_POST["p2min"], $fulldayevent?'59':'0', $_POST["p2month"], $_POST["p2day"], $_POST["p2year"]); + $datep=dol_mktime($fulldayevent?'00':GETPOST("aphour"), $fulldayevent?'00':GETPOST("apmin"), 0, GETPOST("apmonth"), GETPOST("apday"), GETPOST("apyear")); + $datef=dol_mktime($fulldayevent?'23':GETPOST("p2hour"), $fulldayevent?'59':GETPOST("p2min"), $fulldayevent?'59':'0', GETPOST("p2month"), GETPOST("p2day"), GETPOST("p2year")); // Check parameters if (! $datef && $percentage == 100) @@ -393,17 +410,17 @@ if ($action == 'mupdate') $object->fetch($id); $shour = dol_print_date($object->datep,"%H"); $smin = dol_print_date($object->datep, "%M"); - + $newdate=GETPOST('newdate','alpha'); if (empty($newdate) || strpos($newdate,'dayevent_') != 0 ) { - header("Location: ".$backtopage); + header("Location: ".$backtopage); exit; } $datep=dol_mktime($shour, $smin, 0, substr($newdate,13,2), substr($newdate,15,2), substr($newdate,9,4)); if ($datep!=$object->datep) - { + { if (!empty($object->datef)) { $object->datef+=$datep-$object->datep; @@ -414,19 +431,21 @@ if ($action == 'mupdate') { setEventMessage($object->error,'errors'); setEventMessage($object->errors,'errors'); - } + } } if (! empty($backtopage)) { header("Location: ".$backtopage); exit; } - else + else { $action=''; } - + } + + /* * View */ @@ -514,18 +533,19 @@ if ($action == 'create') print 'global->AGENDA_USE_EVENT_TYPE)?' class="fieldrequired"':'').'>'.$langs->trans("Title").''; // Full day - print ''.$langs->trans("EventOnFullDay").''; + print ''.$langs->trans("EventOnFullDay").''; // Date start - $datep=$object->datep; + $datep=($datep?$datep:$object->datep); if (GETPOST('datep','int',1)) $datep=dol_stringtotime(GETPOST('datep','int',1),0); print ''.$langs->trans("DateActionStart").''; if (GETPOST("afaire") == 1) $form->select_date($datep,'ap',1,1,0,"action",1,1,0,0,'fulldayend'); else if (GETPOST("afaire") == 2) $form->select_date($datep,'ap',1,1,1,"action",1,1,0,0,'fulldayend'); else $form->select_date($datep,'ap',1,1,1,"action",1,1,0,0,'fulldaystart'); print ''; + // Date end - $datef=$object->datef; + $datef=($datef?$datef:$object->datef); if (GETPOST('datef','int',1)) $datef=dol_stringtotime(GETPOST('datef','int',1),0); print ''.$langs->trans("DateActionEnd").''; if (GETPOST("afaire") == 1) $form->select_date($datef,'p2',1,1,1,"action",1,1,0,0,'fulldayend'); @@ -537,29 +557,29 @@ if ($action == 'create') print ''.$langs->trans("Status").' / '.$langs->trans("Percentage").''; print ''; $percent=-1; - if (isset($_GET['status']) || isset($_POST['status'])) - { - $percent=GETPOST('status'); - } - else if (isset($_GET['percentage']) || isset($_POST['percentage'])) - { - $percent=GETPOST('percentage'); - } + if (isset($_GET['status']) || isset($_POST['status'])) $percent=GETPOST('status'); + else if (isset($_GET['percentage']) || isset($_POST['percentage'])) $percent=GETPOST('percentage'); else { - if (GETPOST("afaire") == 1) $percent=0; - else if (GETPOST("afaire") == 2) $percent=100; + if (GETPOST('complete') == '0' || GETPOST("afaire") == 1) $percent='0'; + else if (GETPOST('complete') == 100 || GETPOST("afaire") == 2) $percent=100; } $formactions->form_select_status_action('formaction',$percent,1,'complete'); print ''; // Location - print ''.$langs->trans("Location").''; + print ''.$langs->trans("Location").''; // Assigned to $var=false; print ''.$langs->trans("ActionAffectedTo").''; - $form->select_users(GETPOST("affectedto")?GETPOST("affectedto"):(! empty($object->usertodo->id) && $object->usertodo->id > 0 ? $object->usertodo->id : $user->id),'affectedto',1); + if (empty($donotclearsession)) + { + $assignedtouser=GETPOST("affectedtouser")?GETPOST("affectedtouser"):(! empty($object->usertodo->id) && $object->usertodo->id > 0 ? $object->usertodo->id : $user->id); + $_SESSION['assignedtouser']=dol_json_encode(array($assignedtouser=>array('transparency'=>1,'mandatory'=>1))); + } + //print $form->select_dolusers_forevent('affectedto',1); + print $form->select_dolusers(GETPOST("affectedto")?GETPOST("affectedto"):(! empty($object->usertodo->id) && $object->usertodo->id > 0 ? $object->usertodo->id : $user->id),'affectedto',1); print ''; print ''; @@ -577,7 +597,7 @@ if ($action == 'create') if ($conf->global->AGENDA_ENABLE_DONEBY) { print ''.$langs->trans("ActionDoneBy").''; - $form->select_users(GETPOST("doneby")?GETPOST("doneby"):(! empty($object->userdone->id) && $percent==100?$object->userdone->id:0),'doneby',1); + print $form->select_dolusers(GETPOST("doneby")?GETPOST("doneby"):(! empty($object->userdone->id) && $percent==100?$object->userdone->id:0),'doneby',1); print ''; } @@ -650,7 +670,7 @@ if ($action == 'create') // Description print ''.$langs->trans("Description").''; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('note',(GETPOST('note')?GETPOST('note'):$object->note),'',240,'dolibarr_notes','In',true,true,$conf->fckeditor->enabled,ROWS_7,90); + $doleditor=new DolEditor('note',(GETPOST('note')?GETPOST('note'):$object->note),'',180,'dolibarr_notes','In',true,true,$conf->fckeditor->enabled,ROWS_6,90); $doleditor->Create(); print ''; @@ -935,7 +955,7 @@ if ($id > 0) else print dol_print_date($object->datep,'day'); if ($object->percentage == 0 && $object->datep && $object->datep < ($now - $delay_warning)) print img_warning($langs->trans("Late")); print ''; - print ''."\n"; + print ''."\n"; print '
'; print ''; print ''; @@ -963,6 +983,15 @@ if ($id > 0) //print ''; print img_picto($langs->trans("ViewCal"),'object_calendarday','class="hideonsmartphone"').' '; print '
'."\n"; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + //print ''; + print img_picto($langs->trans("ViewCal"),'object_calendarperuser','class="hideonsmartphone"').' '; + print '
'."\n"; print ''; print ''; @@ -982,7 +1011,7 @@ if ($id > 0) print ''.$langs->trans("Location").''.$object->location.''; // Assigned to - print ''.$langs->trans("ActionAffectedTo").''; + print ''.$langs->trans("ActionAffectedTo").''; if ($object->usertodo->id > 0) print $object->usertodo->getNomUrl(1); print ''; diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 318d7efbee9..2318c45f132 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -166,7 +166,7 @@ $nowday=$nowarray['mday']; $listofextcals=array(); // Define list of external calendars (global admin setup) -if (empty($conf->global->AGENDA_DISABLE_EXT) && $conf->global->AGENDA_EXT_NB > 0) +if (empty($conf->global->AGENDA_DISABLE_EXT)) { $i=0; while($i < $conf->global->AGENDA_EXT_NB) @@ -184,19 +184,22 @@ if (empty($conf->global->AGENDA_DISABLE_EXT) && $conf->global->AGENDA_EXT_NB > 0 } } // Define list of external calendars (user setup) -$i=0; -while($i < $conf->global->AGENDA_EXT_NB) +if (empty($user->conf->AGENDA_DISABLE_EXT)) { - $i++; - $source='AGENDA_EXT_SRC_'.$user->id.'_'.$i; - $name='AGENDA_EXT_NAME_'.$user->id.'_'.$i; - $color='AGENDA_EXT_COLOR_'.$user->id.'_'.$i; - $enabled='AGENDA_EXT_ENABLED_'.$user->id.'_'.$i; - $buggedfile='AGENDA_EXT_BUGGEDFILE_'.$user->id.'_'.$i; - if (! empty($user->conf->$source) && ! empty($user->conf->$name)) + $i=0; + while($i < $conf->global->AGENDA_EXT_NB) { - // Note: $conf->global->buggedfile can be empty or 'uselocalandtznodaylight' or 'uselocalandtzdaylight' - $listofextcals[]=array('src'=>$user->conf->$source,'name'=>$user->conf->$name,'color'=>$user->conf->$color,'buggedfile'=>(isset($user->conf->buggedfile)?$user->conf->buggedfile:0)); + $i++; + $source='AGENDA_EXT_SRC_'.$user->id.'_'.$i; + $name='AGENDA_EXT_NAME_'.$user->id.'_'.$i; + $color='AGENDA_EXT_COLOR_'.$user->id.'_'.$i; + $enabled='AGENDA_EXT_ENABLED_'.$user->id.'_'.$i; + $buggedfile='AGENDA_EXT_BUGGEDFILE_'.$user->id.'_'.$i; + if (! empty($user->conf->$source) && ! empty($user->conf->$name)) + { + // Note: $conf->global->buggedfile can be empty or 'uselocalandtznodaylight' or 'uselocalandtzdaylight' + $listofextcals[]=array('src'=>$user->conf->$source,'name'=>$user->conf->$name,'color'=>$user->conf->$color,'buggedfile'=>(isset($user->conf->buggedfile)?$user->conf->buggedfile:0)); + } } } @@ -228,18 +231,20 @@ if ($action=='show_week') $prev_month = $prev['prev_month']; $prev_day = $prev['prev_day']; $first_day = $prev['first_day']; + $first_month= $prev['first_month']; + $first_year = $prev['first_year']; $week = $prev['week']; $day = (int) $day; - $next = dol_get_next_week($day, $week, $month, $year); + $next = dol_get_next_week($first_day, $week, $first_month, $first_year); $next_year = $next['year']; $next_month = $next['month']; $next_day = $next['day']; // Define firstdaytoshow and lastdaytoshow - $firstdaytoshow=dol_mktime(0,0,0,$prev_month,$first_day,$prev_year); - $lastdaytoshow=dol_mktime(0,0,0,$next_month,$next_day,$next_year); + $firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); + $lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 6, 'd'); $max_day_in_month = date("t",dol_mktime(0,0,0,$month,1,$year)); @@ -296,7 +301,7 @@ if (empty($action) || $action=='show_month') if ($action=='show_week') { $nav ="".img_previous($langs->trans("Previous"))."\n"; - $nav.=" ".dol_print_date(dol_mktime(0,0,0,$month,1,$year),"%Y").", ".$langs->trans("Week")." ".$week; + $nav.=" ".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; $nav.=" \n"; $nav.="".img_next($langs->trans("Next"))."\n"; $nav.="   (".$langs->trans("Today").")"; @@ -338,10 +343,6 @@ $showextcals=$listofextcals; if ($conf->use_javascript_ajax) { $s=''; - //print ''; - - //print $langs->trans("Calendars").': '; - //print ''; $s.=''."\n"; } + print '
'; print ''; print ''; print ''."\n"; } + /** * Change color with a delta * @@ -1405,4 +1402,3 @@ function dol_color_minus($color, $minus) $newcolor[4]=((hexdec($newcolor[4])-$minus)<0)?0:dechex((hexdec($newcolor[4])-$minus)); return $newcolor; } - diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php index 055086bbdbb..a2c75386e56 100644 --- a/htdocs/comm/action/listactions.php +++ b/htdocs/comm/action/listactions.php @@ -43,6 +43,7 @@ $pid=GETPOST("projectid",'int',3); $status=GETPOST("status",'alpha'); $type=GETPOST('type'); $actioncode=GETPOST("actioncode","alpha",3)?GETPOST("actioncode","alpha",3):(GETPOST("actioncode")=='0'?'0':(empty($conf->global->AGENDA_USE_EVENT_TYPE)?'AC_OTH':'')); +$dateselect=dol_mktime(0, 0, 0, GETPOST('dateselectmonth'), GETPOST('dateselectday'), GETPOST('dateselectyear')); if ($actioncode == '') $actioncode=(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE); if ($status == '' && ! isset($_GET['status']) && ! isset($_POST['status'])) $status=(empty($conf->global->AGENDA_DEFAULT_FILTER_STATUS)?'':$conf->global->AGENDA_DEFAULT_FILTER_STATUS); @@ -63,15 +64,15 @@ $limit = $conf->liste_limit; $offset = $limit * $page ; if (! $sortorder) { - $sortorder="ASC"; - if ($status == 'todo') $sortorder="ASC"; - if ($status == 'done') $sortorder="DESC"; + $sortorder="DESC"; + if ($status == 'todo') $sortorder="DESC"; + //if ($status == 'done') $sortorder="DESC"; } if (! $sortfield) { - $sortfield="a.percent"; + $sortfield="a.datep"; if ($status == 'todo') $sortfield="a.datep"; - if ($status == 'done') $sortfield="a.datep2"; + //if ($status == 'done') $sortfield="a.datep2"; } // Security check @@ -178,6 +179,8 @@ if ($filtera > 0 || $filtert > 0 || $filterd > 0 || $usergroup > 0) if ($usergroup > 0) $sql.= ($filtera>0||$filtert>0||$filterd>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup; $sql.= ")"; } +//if ($dateselect > 0) $sql.= " AND a.datep BETWEEN '".$db->idate($dateselect)."' AND '".$db->idate($dateselect+3600*24-1).'"'; +if ($dateselect > 0) $sql.= " AND a.datep BETWEEN '".$db->idate($dateselect)."' AND '".$db->idate($dateselect+3600*24-1)."'"; $sql.= $db->order($sortfield,$sortorder); $sql.= $db->plimit($limit + 1, $offset); //print $sql; @@ -191,18 +194,15 @@ if ($resql) $num = $db->num_rows($resql); - $title=$langs->trans("DoneAndToDoActions"); + /*$title=$langs->trans("DoneAndToDoActions"); if ($status == 'done') $title=$langs->trans("DoneActions"); if ($status == 'todo') $title=$langs->trans("ToDoActions"); + */ + $title=$langs->trans("ListOfEvents"); $newtitle=$langs->trans($title); - $tabactive=''; - if ($action == 'show_month') $tabactive='cardmonth'; - if ($action == 'show_week') $tabactive='cardweek'; - if ($action == 'show_day') $tabactive='cardday'; - if ($action == 'show_list') $tabactive='cardlist'; - if ($action == 'show_peruser') $tabactive='cardperuser'; + $tabactive='cardlist'; $head = calendars_prepare_head($param); @@ -230,6 +230,8 @@ if ($resql) print_barre_liste($newtitle, $page, $_SERVER["PHP_SELF"], $param,$sortfield,$sortorder,$link,$num,0,''); //print '
'; + print '
'."\n"; + $i = 0; print ''; print ''; @@ -245,6 +247,22 @@ if ($resql) print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"a.percent",$param,"",'align="right"',$sortfield,$sortorder); print "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + $contactstatic = new Contact($db); $now=dol_now(); $delay_warning=$conf->global->MAIN_DELAY_ACTIONS_TODO*24*60*60; @@ -268,7 +286,7 @@ if ($resql) // Start date print ''; // Third party @@ -354,6 +372,9 @@ if ($resql) $i++; } print "
'; + print $form->select_date($dateselect, 'dateselect', 0, 0, 1, '', 1, 0, 1); + print ''; + //print '  '; + //print ''; + print '
'; - print dol_print_date($db->jdate($obj->dp),"day"); + print dol_print_date($db->jdate($obj->dp),"dayhour"); $late=0; if ($obj->percent == 0 && $obj->dp && $db->jdate($obj->dp) < ($now - $delay_warning)) $late=1; if ($obj->percent == 0 && ! $obj->dp && $obj->dp2 && $db->jdate($obj->dp) < ($now - $delay_warning)) $late=1; @@ -279,7 +297,7 @@ if ($resql) // End date print ''; - print dol_print_date($db->jdate($obj->dp2),"day"); + print dol_print_date($db->jdate($obj->dp2),"dayhour"); print '
"; + + print '
'; + $db->free($resql); } diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index e5cf2f81d98..a1fde80a842 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -4,6 +4,7 @@ * Copyright (C) 2004-2014 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2014 Cedric GROSS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,14 +28,13 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; -require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php'; -if (! empty($conf->projet->enabled)) { - require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; -} +if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; + if (! isset($conf->global->AGENDA_MAX_EVENTS_DAY_VIEW)) $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW=3; @@ -43,7 +43,9 @@ $filtera = GETPOST("userasked","int",3)?GETPOST("userasked","int",3):GETPOST("fi $filtert = GETPOST("usertodo","int",3)?GETPOST("usertodo","int",3):GETPOST("filtert","int",3); $filterd = GETPOST("userdone","int",3)?GETPOST("userdone","int",3):GETPOST("filterd","int",3); $usergroup = GETPOST("usergroup","int",3); -$showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1; +//if (! ($usergroup > 0) && ! ($filtert > 0)) $filtert = $user->id; +//$showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1; +$showbirthday = 0; $sortfield = GETPOST("sortfield",'alpha'); @@ -71,23 +73,48 @@ if (! $user->rights->agenda->allactions->read || $filter =='mine') // If no per $filterd=$user->id; } -$action=GETPOST('action','alpha'); +//$action=GETPOST('action','alpha'); +$action='show_peruser'; //We use 'show_week' mode //$year=GETPOST("year"); $year=GETPOST("year","int")?GETPOST("year","int"):date("Y"); $month=GETPOST("month","int")?GETPOST("month","int"):date("m"); $week=GETPOST("week","int")?GETPOST("week","int"):date("W"); -$day=GETPOST("day","int")?GETPOST("day","int"):0; +$day=GETPOST("day","int")?GETPOST("day","int"):date("d"); $pid=GETPOST("projectid","int",3); $status=GETPOST("status"); $type=GETPOST("type"); $maxprint=(isset($_GET["maxprint"])?GETPOST("maxprint"):$conf->global->AGENDA_MAX_EVENTS_DAY_VIEW); $actioncode=GETPOST("actioncode","alpha",3)?GETPOST("actioncode","alpha",3):(GETPOST("actioncode")=='0'?'0':''); -if ($actioncode == '') $actioncode=(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE); -if ($status == '') $status=(empty($conf->global->AGENDA_DEFAULT_FILTER_STATUS)?'':$conf->global->AGENDA_DEFAULT_FILTER_STATUS); -if (empty($action)) $action=(empty($conf->global->AGENDA_DEFAULT_VIEW)?'show_month':$conf->global->AGENDA_DEFAULT_VIEW); +$dateselect=dol_mktime(0, 0, 0, GETPOST('dateselectmonth'), GETPOST('dateselectday'), GETPOST('dateselectyear')); +if ($dateselect > 0) +{ + $day=GETPOST('dateselectday'); + $month=GETPOST('dateselectmonth'); + $year=GETPOST('dateselectyear'); +} -if (GETPOST('viewcal') && $action != 'show_day' && $action != 'show_week') { +$tmp=empty($conf->global->MAIN_DEFAULT_WORKING_HOURS)?'9-18':$conf->global->MAIN_DEFAULT_WORKING_HOURS; +$tmparray=explode('-',$tmp); +$begin_h = GETPOST('begin_h')?GETPOST('begin_h','int'):($tmparray[0] != '' ? $tmparray[0] : 9); +$end_h = GETPOST('end_h')?GETPOST('end_h'):($tmparray[1] != '' ? $tmparray[1] : 18); +if ($begin_h < 0 || $begin_h > 23) $begin_h = 9; +if ($end_h < 1 || $end_h > 24) $end_h = 18; +if ($end_h <= $begin_h) $end_h = $begin_h + 1; + +$tmp=empty($conf->global->MAIN_DEFAULT_WORKING_DAYS)?'1-5':$conf->global->MAIN_DEFAULT_WORKING_DAYS; +$tmparray=explode('-',$tmp); +$begin_d = GETPOST('begin_d')?GETPOST('begin_d','int'):($tmparray[0] != '' ? $tmparray[0] : 1); +$end_d = GETPOST('end_d')?GETPOST('end_d'):($tmparray[1] != '' ? $tmparray[1] : 5); +if ($begin_d < 1 || $begin_d > 7) $begin_d = 1; +if ($end_d < 1 || $end_d > 7) $end_d = 7; +if ($end_d <= $begin_d) $end_d = $begin_d + 1; + +if ($actioncode == '') $actioncode=(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE); +if ($status == '' && ! isset($_GET['status']) && ! isset($_POST['status'])) $status=(empty($conf->global->AGENDA_DEFAULT_FILTER_STATUS)?'':$conf->global->AGENDA_DEFAULT_FILTER_STATUS); +if (empty($action) && ! isset($_GET['action']) && ! isset($_POST['action'])) $action=(empty($conf->global->AGENDA_DEFAULT_VIEW)?'show_month':$conf->global->AGENDA_DEFAULT_VIEW); + +if (GETPOST('viewcal') && $action != 'show_day' && $action != 'show_week' && $action != 'show_peruser') { $action='show_month'; $day=''; } // View by month if (GETPOST('viewweek') || $action == 'show_week') { @@ -110,7 +137,13 @@ $hookmanager->initHooks(array('agenda')); * Actions */ -// None +if ($action =='delete_action') +{ + $event = new ActionComm($db); + $event->fetch($actionid); + $result=$event->delete(); +} + /* @@ -122,7 +155,6 @@ llxHeader('',$langs->trans("Agenda"),$help_url); $form=new Form($db); $companystatic=new Societe($db); -$contactstatic=new Contact($db); $now=dol_now(); $nowarray=dol_getdate($now); @@ -130,87 +162,30 @@ $nowyear=$nowarray['year']; $nowmonth=$nowarray['mon']; $nowday=$nowarray['mday']; -// Define list of all external calendars + +// Define list of all external calendars (global setup) $listofextcals=array(); -if (empty($conf->global->AGENDA_DISABLE_EXT) && $conf->global->AGENDA_EXT_NB > 0) -{ - $i=0; - while($i < $conf->global->AGENDA_EXT_NB) - { - $i++; - $source='AGENDA_EXT_SRC'.$i; - $name='AGENDA_EXT_NAME'.$i; - $color='AGENDA_EXT_COLOR'.$i; - $buggedfile='AGENDA_EXT_BUGGEDFILE'.$i; - if (! empty($conf->global->$source) && ! empty($conf->global->$name)) - { - // Note: $conf->global->buggedfile can be empty or 'uselocalandtznodaylight' or 'uselocalandtzdaylight' - $listofextcals[]=array('src'=>$conf->global->$source,'name'=>$conf->global->$name,'color'=>$conf->global->$color,'buggedfile'=>(isset($conf->global->buggedfile)?$conf->global->buggedfile:0)); - } - } -} +$prev = dol_get_first_day_week($day, $month, $year); +$first_day = $prev['first_day']; +$first_month = $prev['first_month']; +$first_year = $prev['first_year']; -if (empty($action) || $action=='show_month') -{ - $prev = dol_get_prev_month($month, $year); - $prev_year = $prev['year']; - $prev_month = $prev['month']; - $next = dol_get_next_month($month, $year); - $next_year = $next['year']; - $next_month = $next['month']; +$week = $prev['week']; - $max_day_in_prev_month = date("t",dol_mktime(0,0,0,$prev_month,1,$prev_year)); // Nb of days in previous month - $max_day_in_month = date("t",dol_mktime(0,0,0,$month,1,$year)); // Nb of days in next month - // tmpday is a negative or null cursor to know how many days before the 1 to show on month view (if tmpday=0 we start on monday) - $tmpday = -date("w",dol_mktime(0,0,0,$month,1,$year))+2; - $tmpday+=((isset($conf->global->MAIN_START_WEEK)?$conf->global->MAIN_START_WEEK:1)-1); - if ($tmpday >= 1) $tmpday -= 7; - // Define firstdaytoshow and lastdaytoshow - $firstdaytoshow=dol_mktime(0,0,0,$prev_month,$max_day_in_prev_month+$tmpday,$prev_year); - $next_day=7-($max_day_in_month+1-$tmpday)%7; - if ($next_day < 6) $next_day+=7; - $lastdaytoshow=dol_mktime(0,0,0,$next_month,$next_day,$next_year); -} -if ($action=='show_week') -{ - $prev = dol_get_first_day_week($day, $month, $year); - $prev_year = $prev['prev_year']; - $prev_month = $prev['prev_month']; - $prev_day = $prev['prev_day']; - $first_day = $prev['first_day']; +$day = (int) $day; +$next = dol_get_next_week($day, $week, $month, $year); +$next_year = $next['year']; +$next_month = $next['month']; +$next_day = $next['day']; - $week = $prev['week']; +// Define firstdaytoshow and lastdaytoshow +$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); +$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 6, 'd'); - $day = (int) $day; - $next = dol_get_next_week($day, $week, $month, $year); - $next_year = $next['year']; - $next_month = $next['month']; - $next_day = $next['day']; +$max_day_in_month = date("t",dol_mktime(0,0,0,$month,1,$year)); - // Define firstdaytoshow and lastdaytoshow - $firstdaytoshow=dol_mktime(0,0,0,$prev_month,$first_day,$prev_year); - $lastdaytoshow=dol_mktime(0,0,0,$next_month,$next_day,$next_year); - - $max_day_in_month = date("t",dol_mktime(0,0,0,$month,1,$year)); - - $tmpday = $first_day; -} -if ($action == 'show_day') -{ - $prev = dol_get_prev_day($day, $month, $year); - $prev_year = $prev['year']; - $prev_month = $prev['month']; - $prev_day = $prev['day']; - $next = dol_get_next_day($day, $month, $year); - $next_year = $next['year']; - $next_month = $next['month']; - $next_day = $next['day']; - - // Define firstdaytoshow and lastdaytoshow - $firstdaytoshow=dol_mktime(0,0,0,$prev_month,$prev_day,$prev_year); - $lastdaytoshow=dol_mktime(0,0,0,$next_month,$next_day,$next_year); -} +$tmpday = $first_day; //print 'xx'.$prev_year.'-'.$prev_month.'-'.$prev_day; //print 'xx'.$next_year.'-'.$next_month.'-'.$next_day; //print dol_print_date($firstdaytoshow,'day'); @@ -221,7 +196,8 @@ if ($status == 'done') $title=$langs->trans("DoneActions"); if ($status == 'todo') $title=$langs->trans("ToDoActions"); $param=''; -if ($status) $param="&status=".$status; +if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $param.="&actioncode=".$actioncode; +if ($status || isset($_GET['status']) || isset($_POST['status'])) $param.="&status=".$status; if ($filter) $param.="&filter=".$filter; if ($filtera) $param.="&filtera=".$filtera; if ($filtert) $param.="&filtert=".$filtert; @@ -229,39 +205,46 @@ if ($filterd) $param.="&filterd=".$filterd; if ($socid) $param.="&socid=".$socid; if ($showbirthday) $param.="&showbirthday=1"; if ($pid) $param.="&projectid=".$pid; -if ($actioncode != '') $param.="&actioncode=".$actioncode; if ($type) $param.="&type=".$type; -if ($action == 'show_day' || $action == 'show_week') $param.='&action='.$action; +if ($action == 'show_day' || $action == 'show_week' || $action == 'show_month' || $action != 'show_peruser') $param.='&action='.$action; $param.="&maxprint=".$maxprint; -// Show navigation bar -if (empty($action) || $action=='show_month') -{ - $nav ="".img_previous($langs->trans("Previous"))."\n"; - $nav.=" ".dol_print_date(dol_mktime(0,0,0,$month,1,$year),"%b %Y"); - $nav.=" \n"; - $nav.="".img_next($langs->trans("Next"))."\n"; - $nav.="   (".$langs->trans("Today").")"; - $picto='calendar'; -} -if ($action=='show_week') -{ - $nav ="".img_previous($langs->trans("Previous"))."\n"; - $nav.=" ".dol_print_date(dol_mktime(0,0,0,$month,1,$year),"%Y").", ".$langs->trans("Week")." ".$week; - $nav.=" \n"; - $nav.="".img_next($langs->trans("Next"))."\n"; - $nav.="   (".$langs->trans("Today").")"; - $picto='calendarweek'; -} -if ($action=='show_day') -{ - $nav ="".img_previous($langs->trans("Previous"))."\n"; - $nav.=" ".dol_print_date(dol_mktime(0,0,0,$month,$day,$year),"daytextshort"); - $nav.=" \n"; - $nav.="".img_next($langs->trans("Next"))."\n"; - $nav.="   (".$langs->trans("Today").")"; - $picto='calendarday'; -} + +$prev = dol_get_first_day_week($day, $month, $year); +$prev_year = $prev['prev_year']; +$prev_month = $prev['prev_month']; +$prev_day = $prev['prev_day']; +$first_day = $prev['first_day']; +$first_month= $prev['first_month']; +$first_year = $prev['first_year']; + +$week = $prev['week']; + +$day = (int) $day; +$next = dol_get_next_week($first_day, $week, $first_month, $first_year); +$next_year = $next['year']; +$next_month = $next['month']; +$next_day = $next['day']; + +// Define firstdaytoshow and lastdaytoshow +$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); +$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 6, 'd'); + +$max_day_in_month = date("t",dol_mktime(0,0,0,$month,1,$year)); + +$tmpday = $first_day; + +$nav ="".img_previous($langs->trans("Previous"))."\n"; +$nav.=" ".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; +$nav.=" \n"; +$nav.="".img_next($langs->trans("Next"))."\n"; +$nav.="   (".$langs->trans("Today").")"; +$picto='calendarweek'; + +$nav.='  
'; +$nav.=$form->select_date($dateselect, 'dateselect', 0, 0, 1, '', 1, 0, 1); +$nav.=' '; +$nav.='
'; // Must be after the nav definition $param.='&year='.$year.'&month='.$month.($day?'&day='.$day:''); @@ -270,16 +253,64 @@ $param.='&year='.$year.'&month='.$month.($day?'&day='.$day:''); -$tabactive='cardperuser'; +$tabactive=''; +if ($action == 'show_month') $tabactive='cardmonth'; +if ($action == 'show_week') $tabactive='cardweek'; +if ($action == 'show_day') $tabactive='cardday'; +if ($action == 'show_list') $tabactive='cardlist'; +if ($action == 'show_peruser') $tabactive='cardperuser'; $paramnoaction=preg_replace('/action=[a-z_]+/','',$param); $head = calendars_prepare_head($paramnoaction); dol_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action'); -print_actions_filter($form,$canedit,$status,$year,$month,$day,$showbirthday,$filtera,$filtert,$filterd,$pid,$socid,$action,$listofextcals,$actioncode,$usergroup); +print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, $filtera, $filtert, $filterd, $pid, $socid, $action, $listofextcals, $actioncode, $usergroup); dol_fiche_end(); +$showextcals=$listofextcals; +// Legend +if ($conf->use_javascript_ajax) +{ + $s=''; + $s.='' . "\n"; + if (! empty($conf->use_javascript_ajax)) + { + $s.='
' . $langs->trans("LocalAgenda").'  
'; + if (is_array($showextcals) && count($showextcals) > 0) + { + foreach ($showextcals as $val) + { + $htmlname = dol_string_nospecial($val['name']); + $s.='' . "\n"; + $s.='
' . $val ['name'] . '  
'; + } + } + } + //$s.='
'.$langs->trans("AgendaShowBirthdayEvents").'  
'; +} + + + +$link=''; print_fiche_titre($s,$link.'     '.$nav, ''); @@ -336,7 +367,7 @@ else if ($type) $sql.= " AND ca.id = ".$type; if ($status == '0') { $sql.= " AND a.percent = 0"; } if ($status == '-1') { $sql.= " AND a.percent = -1"; } // Not applicable -if ($status == '50') { $sql.= " AND (a.percent >= 0 AND a.percent < 100)"; } // Running +if ($status == '50') { $sql.= " AND (a.percent > 0 AND a.percent < 100)"; } // Running already started if ($status == 'done' || $status == '100') { $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep2 <= '".$db->idate($now)."'))"; } if ($status == 'todo') { $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep2 > '".$db->idate($now)."'))"; } if ($filtera > 0 || $filtert > 0 || $filterd > 0 || $usergroup > 0) @@ -349,7 +380,7 @@ if ($filtera > 0 || $filtert > 0 || $filterd > 0 || $usergroup > 0) $sql.= ")"; } // Sort on date -$sql.= ' ORDER BY datep'; +$sql.= ' ORDER BY fk_user_action, datep'; //fk_user_action //print $sql; dol_syslog("comm/action/index.php", LOG_DEBUG); @@ -368,7 +399,8 @@ if ($resql) $event->datep=$db->jdate($obj->datep); // datep and datef are GMT date $event->datef=$db->jdate($obj->datep2); $event->type_code=$obj->code; - $event->libelle=$obj->label; + $event->libelle=$obj->label; // deprecated + $event->label=$obj->label; $event->percentage=$obj->percent; $event->author->id=$obj->fk_user_author; // user id of creator $event->usertodo->id=$obj->fk_user_action; // user id of owner @@ -446,6 +478,7 @@ else dol_print_error($db); } + $maxnbofchar=18; $cachethirdparties=array(); $cachecontacts=array(); @@ -459,22 +492,387 @@ if (is_readable($color_file)) if (! is_array($theme_datacolor)) $theme_datacolor=array(array(120,130,150), array(200,160,180), array(190,190,220)); +$newparam=$param; // newparam is for birthday links +$newparam=preg_replace('/showbirthday=/i','showbirthday_=',$newparam); // To avoid replacement when replace day= is done +$newparam=preg_replace('/action=show_month&?/i','',$newparam); +$newparam=preg_replace('/action=show_week&?/i','',$newparam); +$newparam=preg_replace('/day=[0-9]+&?/i','',$newparam); +$newparam=preg_replace('/month=[0-9]+&?/i','',$newparam); +$newparam=preg_replace('/year=[0-9]+&?/i','',$newparam); +$newparam=preg_replace('/viewweek=[0-9]+&?/i','',$newparam); +$newparam=preg_replace('/showbirthday_=/i','showbirthday=',$newparam); // Restore correct parameter +$newparam.='&viewweek=1'; + +echo '
'; +echo ''; +echo ''; +echo '' ; +echo '
'; -/* TODO Export - print ' - - - +// Table : +echo ''; + +echo ''; +echo ''; +$i=0; +while ($i < 7) +{ + if (($i + 1) < $begin_d || ($i + 1) > $end_d) + { + $i++; + continue; + } + echo '\n"; + $i++; +} +echo "\n"; + +echo ''; +echo ''; +$i=0; +while ($i < 7) +{ + if (($i + 1) < $begin_d || ($i + 1) > $end_d) + { + $i++; + continue; + } + for ($h = $begin_h; $h < $end_h; $h++) + { + echo '"; + } + echo "\n"; + $i++; +} +echo "\n"; + +// Define $usernames +$usernames = array(); //init +/* Use this to have list of users only if users have events +foreach ($eventarray as $daykey => $notused) +{ + $annee = date('Y',$daykey); + $mois = date('m',$daykey); + $jour = date('d',$daykey); + //if ($day==$jour && $month==$mois && $year==$annee) + //{ + //Tout les events à la même date : + foreach ($eventarray[$daykey] as $index => $event) + { + $myuser = new User($db); + $user_id = $event->usertodo->id; + $myuser->fetch($user_id); + $username = $myuser->getFullName($langs); + if (! in_array($username, $usernames)) + { + $usernames[] = $username; + } + } + //} +}*/ +if ($filtert > 0) +{ + $tmpuser = new User($db); + $tmpuser->fetch($filtert); + $usernames[] = $tmpuser; +} +else if ($usergroup) +{ + $tmpgroup = new UserGroup($db); + $tmpgroup->fetch($usergroup); + $usernames = $tmpgroup->listUsersForGroup(); +} +else +{ + $tmpgroup = new UserGroup($db); + //$tmpgroup->fetch($usergroup); No fetch, we want all users for all groups + $usernames = $tmpgroup->listUsersForGroup(); +} + + +// Loop on each user to show calendar +$sav = $tmpday; +$showheader = true; +foreach ($usernames as $username) +{ + echo ""; + echo ''; + $tmpday = $sav; + + $i = 0; + for ($iter_day = 0; $iter_day < 7; $iter_day++) + { + if (($i + 1) < $begin_d || ($i + 1) > $end_d) + { + $i++; + continue; + } + + // Show days of the current week + $curtime = dol_time_plus_duree($firstdaytoshow, $iter_day, 'd'); + $tmparray = dol_getdate($curtime,'fast'); + $tmpday = $tmparray['mday']; + $tmpmonth = $tmparray['mon']; + $tmpyear = $tmparray['year']; + + $style='cal_current_month'; + if ($iter_day == 6) $style.=' cal_other_month'; + $today=0; + $todayarray=dol_getdate($now,'fast'); + if ($todayarray['mday']==$tmpday && $todayarray['mon']==$month && $todayarray['year']==$year) $today=1; + if ($today) $style='cal_today_peruser'; + + show_day_events2($username, $tmpday, $month, $year, $monthshown, $style, $eventarray, 0, $maxnbofchar, $newparam, 1, 300, $showheader); + + $i++; + } + echo "\n"; + $showheader = false; +} + +echo "
'; + echo $langs->trans("Day".(($i+(isset($conf->global->MAIN_START_WEEK)?$conf->global->MAIN_START_WEEK:1)) % 7)); + print "
"; + if ($i) print dol_print_date(dol_time_plus_duree($firstdaytoshow, $i, 'd'),'day'); + else print dol_print_date($firstdaytoshow,'day'); + echo "
'; + print ''.sprintf("%02d",$h).''; + print "
' . $username->getNomUrl(1). '
\n"; + + +// Add js code to manage click on a box +print ''; + - -'; -*/ llxFooter(); $db->close(); + + + + + +/** + * Show event of a particular day + * + * @param int $day Day + * @param int $month Month + * @param int $year Year + * @param int $monthshown Current month shown in calendar view + * @param string $style Style to use for this day + * @param array &$eventarray Array of events + * @param int $maxprint Nb of actions to show each day on month view (0 means no limit) + * @param int $maxnbofchar Nb of characters to show for event line + * @param string $newparam Parameters on current URL + * @param int $showinfo Add extended information (used by day view) + * @param int $minheight Minimum height for each event. 60px by default. + * @return void + */ +function show_day_events2($username, $day, $month, $year, $monthshown, $style, &$eventarray, $maxprint=0, $maxnbofchar=16, $newparam='', $showinfo=0, $minheight=60, $showheader=false) +{ + global $db; + global $user, $conf, $langs; + global $filter, $filtera, $filtert, $filterd, $status, $actioncode; // Filters used into search form + global $theme_datacolor; + global $cachethirdparties, $cachecontacts, $colorindexused; + global $begin_h, $end_h; + + $cases1 = array(); // Color first half hour + $cases2 = array(); // Color second half hour + + $curtime = dol_mktime(0, 0, 0, $month, $day, $year); + + $i=0; $nummytasks=0; $numother=0; $numbirthday=0; $numical=0; $numicals=array(); + $ymd=sprintf("%04d",$year).sprintf("%02d",$month).sprintf("%02d",$day); + + $nextindextouse=count($colorindexused); // At first run this is 0, so fist user has 0, next 1, ... + + foreach ($eventarray as $daykey => $notused) + { + $annee = date('Y',$daykey); + $mois = date('m',$daykey); + $jour = date('d',$daykey); + if ($day==$jour && $month==$mois && $year==$annee) + { + //Tout les events à la même date : + foreach ($eventarray[$daykey] as $index => $event) + { + if ($username->id != $event->usertodo->id) continue; // We discard record if event is from another user than user we want to show + + $ponct=($event->date_start_in_calendar == $event->date_end_in_calendar); + + // Define $color and $cssclass of event + $color=-1; $cssclass=''; $colorindex=-1; + if ((! empty($event->author->id) && $event->author->id == $user->id) + || (! empty($event->usertodo->id) && $event->usertodo->id == $user->id) + || (! empty($event->userdone->id) && $event->userdone->id == $user->id)) + { + $nummytasks++; $cssclass='family_mytasks'; + } + else if ($event->type_code == 'ICALEVENT') + { + $numical++; + if (! empty($event->icalname)) { + if (! isset($numicals[dol_string_nospecial($event->icalname)])) { + $numicals[dol_string_nospecial($event->icalname)] = 0; + } + $numicals[dol_string_nospecial($event->icalname)]++; + } + $color=$event->icalcolor; + $cssclass=(! empty($event->icalname)?'family_'.dol_string_nospecial($event->icalname):'family_other unsortable'); + } + else if ($event->type_code == 'BIRTHDAY') { + $numbirthday++; $colorindex=2; $cssclass='family_birthday unsortable'; $color=sprintf("%02x%02x%02x",$theme_datacolor[$colorindex][0],$theme_datacolor[$colorindex][1],$theme_datacolor[$colorindex][2]); + } + else { $numother++; $cssclass='family_other'; + } + if ($color == -1) // Color was not forced. Set color according to color index. + { + // Define color index if not yet defined + $idusertouse=($event->usertodo->id?$event->usertodo->id:0); + if (isset($colorindexused[$idusertouse])) + { + $colorindex=$colorindexused[$idusertouse]; // Color already assigned to this user + } + else + { + $colorindex=$nextindextouse; + $colorindexused[$idusertouse]=$colorindex; + if (! empty($theme_datacolor[$nextindextouse+1])) $nextindextouse++; // Prepare to use next color + } + // Define color + $color=sprintf("%02x%02x%02x",$theme_datacolor[$colorindex][0],$theme_datacolor[$colorindex][1],$theme_datacolor[$colorindex][2]); + } + //$cssclass=$cssclass.' '.$cssclass.'_day_'.$ymd; + + // Show rect of event + for ($h = $begin_h; $h < $end_h; $h++) + { + $color = ''; //init + if (empty($event->fulldayevent)) + { + $a = dol_mktime((int) $h,0,0,$month,$day,$year,false,false); + $b = dol_mktime((int) $h,30,0,$month,$day,$year,false,false); + $c = dol_mktime((int) $h+1,0,0,$month,$day,$year,false,false); + + $dateendtouse=$event->date_end_in_calendar; + if ($dateendtouse==$event->date_start_in_calendar) $dateendtouse++; + + if ($event->date_start_in_calendar < $b && $dateendtouse > $a) + { + $busy=$event->transparency; + $cases1[$h][$event->id]['busy']=$busy; + $cases1[$h][$event->id]['string']=dol_print_date($event->date_start_in_calendar,'dayhour').' - '.dol_print_date($event->date_end_in_calendar,'dayhour').' - '.$event->label; + } + if ($event->date_start_in_calendar < $c && $dateendtouse > $b) + { + $busy=$event->transparency; + $cases2[$h][$event->id]['busy']=$busy; + $cases2[$h][$event->id]['string']=dol_print_date($event->date_start_in_calendar,'dayhour').' - '.dol_print_date($event->date_end_in_calendar,'dayhour').' - '.$event->label; + } + } + else + { + $busy=$event->transparency; + $cases1[$h][$event->id]['busy']=$busy; + $cases2[$h][$event->id]['busy']=$busy; + $cases1[$h][$event->id]['string']=$event->label; + $cases2[$h][$event->id]['string']=$event->label; + break; + } + } + $i++; + } + + break; + } + } + + for ($h = $begin_h; $h < $end_h; $h++) + { + $style1='';$style2=''; + $string1=' ';$string2=' '; + $title1='';$title2=''; + if (isset($cases1[$h]) && $cases1[$h] != '') + { + $title1=count($cases1[$h]).' '.(count($cases1[$h])==1?$langs->trans("Event"):$langs->trans("Events")); + $string1=' '; + $style1='peruser_notbusy'; + foreach($cases1[$h] as $id => $ev) + { + if ($ev['busy']) $style1='peruser_busy'; + } + } + if (isset($cases2[$h]) && $cases2[$h] != '') + { + $title2=count($cases2[$h]).' '.(count($cases2[$h])==1?$langs->trans("Event"):$langs->trans("Events")); + $string2=' '; + $style2='peruser_notbusy'; + foreach($cases2[$h] as $id => $ev) + { + if ($ev['busy']) $style2='peruser_busy'; + } + } + + + if ($h == $begin_h) echo ''; + else echo ''; + if (count($cases1[$h]) == 1) // 1 seul evenement + { + $ids=array_keys($cases1[$h]); + $output = array_slice($cases1[$h], 0, 1); + if ($output[0]['string']) $title1.=' - '.$output[0]['string']; + } + if (count($cases2[$h]) == 1) // 1 seul evenement + { + $ids=array_keys($cases2[$h]); + $output = array_slice($cases2[$h], 0, 1); + if ($output[0]['string']) $title2.=' - '.$output[0]['string']; + } + $ids1=join(',',array_keys($cases1[$h])); + $ids2=join(',',array_keys($cases2[$h])); + //var_dump($cases1[$h]); + print ''; + print ''; + print '
'; + print $string1; + print ''; + print $string2; + print '
'; + print ''; + } +} diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index df51f91e1a2..e10ea970b43 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -98,11 +98,10 @@ if ($action == 'add') $result=$obj->add_to_target($id,$filtersarray); } } - if ($result > 0) { setEventMessage($langs->trans("XTargetsAdded",$result),'mesgs'); - + header("Location: ".$_SERVER['PHP_SELF']."?id=".$id); exit; } @@ -167,7 +166,6 @@ if ($_POST["button_removefilter"]) /* * View */ - llxHeader('',$langs->trans("Mailing"),'EN:Module_EMailing|FR:Module_Mailing|ES:Módulo_Mailing'); $form = new Form($db); @@ -306,12 +304,14 @@ if ($object->fetch($id) >= 0) print img_object($langs->trans("Module").': '.get_class($obj),$obj->picto).' '.$obj->getDesc(); print ''; - /* - print ''; - print $modulename; - print ""; - */ - $nbofrecipient=$obj->getNbOfRecipients(''); + try { + $nbofrecipient=$obj->getNbOfRecipients(''); + } + catch(Exception $e) + { + dol_syslog($e->getMessage(), LOG_ERR); + } + print ''; if ($nbofrecipient >= 0) { @@ -324,7 +324,13 @@ if ($object->fetch($id) >= 0) print ''; print ''; - $filter=$obj->formFilter(); + try { + $filter=$obj->formFilter(); + } + catch(Exception $e) + { + dol_syslog($e->getMessage(), LOG_ERR); + } if ($filter) print $filter; else print $langs->trans("None"); print ''; @@ -421,7 +427,7 @@ if ($object->fetch($id) >= 0) print ''; print ' '; print ''; - + print ''; // Ligne des champs de filtres @@ -446,7 +452,7 @@ if ($object->fetch($id) >= 0) print ''; print ' '; print ''; - + // Date sending print ''; print ' '; @@ -530,7 +536,7 @@ if ($object->fetch($id) >= 0) print $object::libStatutDest($obj->statut,2); print ''; } - + //Sreach Icon print ''; print ''; diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 35ab381a35f..2cfa97549b1 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -365,7 +365,11 @@ else if ($action == 'add' && $user->rights->propal->creer) { if ($result > 0) { $lines = $srcobject->lines; - if (empty($lines) && method_exists($srcobject, 'fetch_lines')) $lines = $srcobject->fetch_lines(); + if (empty($lines) && method_exists($srcobject, 'fetch_lines')) + { + $srcobject->fetch_lines(); + $lines = $srcobject->lines; + } $fk_parent_line=0; $num=count($lines); @@ -1283,7 +1287,9 @@ if ($action == 'create') { $objectsrc = new $classname($db); $objectsrc->fetch($originid); if (empty($objectsrc->lines) && method_exists($objectsrc, 'fetch_lines')) + { $objectsrc->fetch_lines(); + } $objectsrc->fetch_thirdparty(); $projectid = (! empty($objectsrc->fk_project) ? $objectsrc->fk_project : ''); @@ -1951,7 +1957,8 @@ if ($action == 'create') { print ''; } - if ($soc->outstanding_limit) { + if ($soc->outstanding_limit) + { // Outstanding Bill print ''; print $langs->trans('OutstandingBill'); @@ -1962,6 +1969,26 @@ if ($action == 'create') { print ''; } + if (! empty($conf->global->BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL)) + { + // Bank Account + print ''; + print ''; + if ($action != 'editbankaccount' && $user->rights->propal->creer) + print ''; + print '
'; + print $langs->trans('BankAccount'); + print 'id.'">'.img_edit($langs->trans('SetBankAccount'),1).'
'; + print ''; + if ($action == 'editbankaccount') { + $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1); + } else { + $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none'); + } + print ''; + print ''; + } + // Other attributes (TODO Move this into an include) $res = $object->fetch_optionals($object->id, $extralabels); $parameters = array('colspan' => ' colspan="3"'); @@ -2009,23 +2036,6 @@ if ($action == 'create') { } } - // Bank Account - print ''; - print ''; - if ($action != 'editbankaccount' && $user->rights->propal->creer) - print ''; - print '
'; - print $langs->trans('BankAccount'); - print 'id.'">'.img_edit($langs->trans('SetBankAccount'),1).'
'; - print ''; - if ($action == 'editbankaccount') { - $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1); - } else { - $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'none'); - } - print ''; - print ''; - // Amount HT print '' . $langs->trans('AmountHT') . ''; print '' . price($object->total_ht, '', $langs, 0, - 1, - 1, $conf->currency) . ''; diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index ac66f7fb048..a12b6dc7256 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1,7 +1,7 @@ * Copyright (C) 2004-2012 Laurent Destailleur - * Copyright (C) 2005-2013 Regis Houssin + * Copyright (C) 2005-2014 Regis Houssin * Copyright (C) 2006 Andre Cianfarani * Copyright (C) 2010-2014 Juanjo Menent * Copyright (C) 2011 Jean Heimburger @@ -9,7 +9,7 @@ * Copyright (C) 2013 Florian Henry * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU *General Public License as published by + * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 1d59311404e..2fda0277bec 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -271,10 +271,12 @@ else if ($action == 'add' && $user->rights->commande->creer) { if ($ret < 0) $error ++; - if (! $error) { + if (! $error) + { $object_id = $object->create($user); - if ($object_id > 0) { + if ($object_id > 0) + { dol_include_once('/' . $element . '/class/' . $subelement . '.class.php'); $classname = ucfirst($subelement); @@ -282,15 +284,20 @@ else if ($action == 'add' && $user->rights->commande->creer) { dol_syslog("Try to find source object origin=" . $object->origin . " originid=" . $object->origin_id . " to add lines"); $result = $srcobject->fetch($object->origin_id); - if ($result > 0) { + if ($result > 0) + { $lines = $srcobject->lines; if (empty($lines) && method_exists($srcobject, 'fetch_lines')) - $lines = $srcobject->fetch_lines(); + { + $srcobject->fetch_lines(); + $lines = $srcobject->lines; + } $fk_parent_line = 0; $num = count($lines); - for($i = 0; $i < $num; $i ++) { + for($i = 0; $i < $num; $i ++) + { $label = (! empty($lines [$i]->label) ? $lines [$i]->label : ''); $desc = (! empty($lines [$i]->desc) ? $lines [$i]->desc : $lines [$i]->libelle); $product_type = (! empty($lines [$i]->product_type) ? $lines [$i]->product_type : 0); diff --git a/htdocs/commande/orderstoinvoice.php b/htdocs/commande/orderstoinvoice.php index 8b16428b23f..814e52884ab 100644 --- a/htdocs/commande/orderstoinvoice.php +++ b/htdocs/commande/orderstoinvoice.php @@ -100,7 +100,7 @@ if (($action == 'create' || $action == 'add') && !$error) require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php'; if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; - + $langs->load('bills'); $langs->load('products'); $langs->load('main'); @@ -216,13 +216,17 @@ if (($action == 'create' || $action == 'add') && !$error) $result=$objectsrc->fetch($orders_id[$ii]); if ($result > 0) { - if ($closeOrders) + if ($closeOrders) { $objectsrc->classifyBilled(); $objectsrc->setStatut(3); } $lines = $objectsrc->lines; - if (empty($lines) && method_exists($objectsrc,'fetch_lines')) $lines = $objectsrc->fetch_lines(); + if (empty($lines) && method_exists($objectsrc, 'fetch_lines')) + { + $objectsrc->fetch_lines(); + $lines = $objectsrc->lines; + } $fk_parent_line=0; $num=count($lines); for ($i=0;$i<$num;$i++) diff --git a/htdocs/compta/bank/fiche.php b/htdocs/compta/bank/fiche.php index 27acf7eba59..c118186df27 100644 --- a/htdocs/compta/bank/fiche.php +++ b/htdocs/compta/bank/fiche.php @@ -240,7 +240,7 @@ if ($action == 'create') print ''; // Ref - print ''; + print ''; print ''; // Label @@ -306,11 +306,15 @@ if ($action == 'create') $doleditor=new DolEditor('account_comment',$account->comment,'',200,'dolibarr_notes','',false,true,$conf->global->FCKEDITOR_ENABLE_SOCIETE,10,70); $doleditor->Create(); print ''; + + print '
'.$langs->trans("Ref").'
'.$langs->trans("Ref").'ref).'" maxlength="12">
'; + + print '
'; + + print ''; // Sold - print ''; - - print ''; + print ''; print ''; print ''; @@ -332,12 +336,12 @@ if ($action == 'create') // Accountancy code if (! empty($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED)) { - print ''; + print ''; print ''; } else { - print ''; + print ''; print ''; } @@ -506,8 +510,7 @@ else $account->fetch(GETPOST('id','int')); print_fiche_titre($langs->trans("EditFinancialAccount")); - print "
"; - + if ($conf->use_javascript_ajax) { print "\n".''; + +$sql = "(SELECT s.rowid, s.nom as name , s.address, s.zip , s.town, s.code_compta as compta , "; +$sql .= " s.fk_forme_juridique , s.fk_pays , s.phone , s.fax , f.datec , f.fk_soc , cp.label as country "; +$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s"; +$sql .= ", " . MAIN_DB_PREFIX . "facture as f"; +$sql .= ", " . MAIN_DB_PREFIX . "c_country as cp"; +$sql .= " WHERE f.fk_soc = s.rowid"; +$sql .= " AND s.fk_pays = cp.rowid"; +if (! empty($date_start) && ! empty($date_end)) + $sql .= " AND f.datec >= '" . $db->idate($date_start) . "' AND f.datec <= '" . $db->idate($date_end) . "'"; +$sql .= " AND f.entity = " . $conf->entity; +if ($socid) + $sql .= " AND f.fk_soc = " . $socid; +$sql .= " GROUP BY name"; +$sql .= ")"; +$sql .= "UNION (SELECT s.rowid, s.nom as name , s.address, s.zip , s.town, s.code_compta_fournisseur as compta , "; +$sql .= " s.fk_forme_juridique , s.fk_pays , s.phone , s.fax , ff.datec , ff.fk_soc , cp.label as country "; +$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s"; +$sql .= ", " . MAIN_DB_PREFIX . "facture_fourn as ff"; +$sql .= ", " . MAIN_DB_PREFIX . "c_country as cp"; +$sql .= " WHERE ff.fk_soc = s.rowid"; +$sql .= " AND s.fk_pays = cp.rowid"; +if (! empty($date_start) && ! empty($date_end)) + $sql .= " AND ff.datec >= '" . $db->idate($date_start) . "' AND ff.datec <= '" . $db->idate($date_end) . "'"; +$sql .= " AND ff.entity = " . $conf->entity; +if ($socid) + $sql .= " AND f.fk_soc = " . $socid; +$sql .= " GROUP BY name"; +$sql .= ")"; + +$sql .= "ORDER BY name ASC"; + +dol_syslog('accountancy/admin/thirdpartyaccount.php:: $sql=' . $sql); +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + // export csv + if (GETPOST('action') == 'export_csv') { + + header('Content-Type: text/csv'); + header('Content-Disposition: attachment;filename=export_csv.csv'); + + $obj = $db->fetch_object($resql); + $var = ! $var; + + print '"' . $obj->compta . '",'; + print '"' . $obj->address . '",'; + print '"' . $obj->zip . '",'; + print '"' . $obj->town . '",'; + print '"' . $obj->country . '",'; + print '"' . $obj->phone . '",'; + print '"' . $obj->fax . '",'; + print "\n"; + $i ++; + } + + /* + * View + */ + + $thirdpartystatic = new Societe($db); + + print '

'; + + print '
'.$langs->trans("InitialBankBalance").'...
'.$langs->trans("InitialBankBalance").'
'.$langs->trans("InitialBankBalance").'solde)).'">
'.$langs->trans("Date").'
'.$langs->trans("AccountancyCode").'
'.$langs->trans("AccountancyCode").'
'.$langs->trans("AccountancyCode").'
'.$langs->trans("AccountancyCode").'
'; + print "
\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $var = True; + + while ( $obj = $db->fetch_object($resql) ) { + + $var = ! $var; + + print ""; + print ''; + print '' . "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; + + $i ++; + } + + print "
' . $langs->trans("ThirdParties") . '' . $langs->trans("AccountNumber") . '' . $langs->trans("RaisonSociale") . '' . $langs->trans("Address") . '' . $langs->trans("Zip") . '' . $langs->trans("Town") . '' . $langs->trans("Country") . '' . $langs->trans("Contact") . '' . $langs->trans("Phone") . '' . $langs->trans("Fax") . '
'; + $thirdpartystatic->id = $obj->rowid; + $thirdpartystatic->name = $obj->name; + $thirdpartystatic->client = $obj->client; + $thirdpartystatic->canvas = $obj->canvas; + $thirdpartystatic->status = $obj->status; + print $thirdpartystatic->getNomUrl(1); + print '' . $obj->compta . '' . $obj->address . '' . $obj->zip . '' . $obj->town . '' . $obj->country . '' . $obj->phone . '' . $obj->fax . '
"; + $db->free($resql); +} else { + dol_print_error($db); +} + +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 75877895e52..f26718f1dd9 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -364,7 +364,22 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase /** - * testDolTextIsHtml + * testDolUnaccent + * + * @return boolean + */ + public function testDolUnaccent() + { + // Text not already HTML + + $input="A string\nwith a à ä é è ë ï ü ö ÿ, &, < and >."; + $after=dol_string_unaccent($input); + $this->assertEquals("A string\nwith a a a e e e i u o y, &, < and >.",$after); + } + + + /** + * testDolUtf8Check * * @return void */