Merge pull request #3 from Dolibarr/develop
Merge pull request #3 from Dolibarr/develop
This commit is contained in:
commit
19980ec708
62
COPYRIGHT
62
COPYRIGHT
@ -9,41 +9,41 @@ More information: http://www.gnu.org/licenses/gpl-3.0.txt
|
||||
|
||||
Dolibarr uses some external libraries released under different licenses. This is compatibility summary:
|
||||
|
||||
Component Version License GPL Compatible Usage
|
||||
Component Version License GPL Compatible Usage
|
||||
-------------------------------------------------------------------------------------
|
||||
PHP libraries:
|
||||
AdoDb-Date 0.32 Modified BSD License Yes Date convertion (not into rpm package)
|
||||
CKEditor 4.3.3 LGPL-2.1+ Yes Editor WYSIWYG
|
||||
FPDI 1.4.2 Apache Software License 2.0 Yes PDF templates management
|
||||
FPDF_TPL 1.2 Apache Software License 2.0 Yes PDF templates management
|
||||
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.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.093 LGPL-3+ Yes PDF generation
|
||||
AdoDb-Date 0.32 Modified BSD License Yes Date convertion (not into rpm package)
|
||||
CKEditor 4.3.3 LGPL-2.1+ Yes Editor WYSIWYG
|
||||
FPDI 1.4.2 Apache Software License 2.0 Yes PDF templates management
|
||||
FPDF_TPL 1.2 Apache Software License 2.0 Yes PDF templates management
|
||||
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.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.093 LGPL-3+ Yes PDF generation
|
||||
|
||||
JS libraries:
|
||||
jQuery 1.8.2 MIT License Yes JS library
|
||||
jQuery UI 1.9.1 GPL and MIT License Yes JS library plugin UI
|
||||
jQuery UI Multiselect ? GPL and MIT License Yes JS library plugin for sexier multiselect
|
||||
jQuery blockUI 2.43 GPL and MIT License Yes JS library plugin blockUI (to use ajax popups)
|
||||
jQuery Colorpicker 1.1 MIT License Yes JS library for color picker for a defined list of colors
|
||||
jQuery DataTables 1.9.4 BSD Yes JS library for tables output
|
||||
jQuery FileUpload 5.0.3 GPL and MIT License Yes JS library to upload files
|
||||
jQuery Flot 0.7 MIT License Yes JS library to build graph
|
||||
jQuery JCrop 0.9.8 GPL and MIT License Yes JS library plugin Crop (to crop images)
|
||||
jQuery Jeditable 1.7.1 GPL and MIT License Yes JS library plugin jeditable (to edit in place)
|
||||
jQuery jNotify 1.1.00 Apache Software License 2.0 Yes JS library plugin jNotify (to use ajax popups)
|
||||
jQuery jPicker 1.1.6 GPL and MIT License Yes JS library for color picker with not defined list of colors
|
||||
jQuery jqueryFileTree 1.0.1 GPL and MIT License Yes JS library for color picker with not defined list of colors
|
||||
jQuery jquerytreeview 1.4.1 MIT License Yes JS library for color picker with not defined list of colors
|
||||
jQuery Layout 1.3.0rc30.74 GPL and MIT License Yes JS library plugin Layout (RC-29.15)
|
||||
jQuery Mobile 1.3.0 GPL and MIT License Yes JS library for smartphone (not used)
|
||||
jQuery TableDnD 0.6 GPL and MIT License Yes JS library plugin TableDnD (to reorder table rows)
|
||||
jQuery Timepicker 1.1.0 GPL and MIT License Yes JS library Timepicker addon for Datepicker
|
||||
jQuery Tiptip 1.3 GPL and MIT License Yes JS library for tooltips
|
||||
jsGantt 1.2 BSD License Yes JS library (to build Gantt reports)
|
||||
jQuery 1.8.2 MIT License Yes JS library
|
||||
jQuery UI 1.9.1 GPL and MIT License Yes JS library plugin UI
|
||||
jQuery multiple-select 1.1.0 MIT License Yes JS library plugin for sexier multiselect
|
||||
jQuery blockUI 2.43 GPL and MIT License Yes JS library plugin blockUI (to use ajax popups)
|
||||
jQuery Colorpicker 1.1 MIT License Yes JS library for color picker for a defined list of colors
|
||||
jQuery DataTables 1.9.4 BSD Yes JS library for tables output
|
||||
jQuery FileUpload 5.0.3 GPL and MIT License Yes JS library to upload files
|
||||
jQuery Flot 0.7 MIT License Yes JS library to build graph
|
||||
jQuery JCrop 0.9.8 GPL and MIT License Yes JS library plugin Crop (to crop images)
|
||||
jQuery Jeditable 1.7.1 GPL and MIT License Yes JS library plugin jeditable (to edit in place)
|
||||
jQuery jNotify 1.1.00 Apache Software License 2.0 Yes JS library plugin jNotify (to use ajax popups)
|
||||
jQuery jPicker 1.1.6 GPL and MIT License Yes JS library for color picker with not defined list of colors
|
||||
jQuery jqueryFileTree 1.0.1 GPL and MIT License Yes JS library for color picker with not defined list of colors
|
||||
jQuery jquerytreeview 1.4.1 MIT License Yes JS library for color picker with not defined list of colors
|
||||
jQuery Layout 1.3.0rc30.74 GPL and MIT License Yes JS library plugin Layout (RC-29.15)
|
||||
jQuery Mobile 1.3.0 GPL and MIT License Yes JS library for smartphone (not used)
|
||||
jQuery TableDnD 0.6 GPL and MIT License Yes JS library plugin TableDnD (to reorder table rows)
|
||||
jQuery Timepicker 1.1.0 GPL and MIT License Yes JS library Timepicker addon for Datepicker
|
||||
jQuery Tiptip 1.3 GPL and MIT License Yes JS library for tooltips
|
||||
jsGantt 1.2 BSD License Yes JS library (to build Gantt reports)
|
||||
|
||||
For licenses compatibility informations:
|
||||
http://www.fsf.org/licensing/licenses/index_html
|
||||
|
||||
@ -5,6 +5,10 @@ English Dolibarr ChangeLog
|
||||
|
||||
***** ChangeLog for 3.7 compared to 3.6.* *****
|
||||
For users:
|
||||
- New: Agenda export by project #1967.
|
||||
- New: Increase length of thirdparty to 128 chars.
|
||||
- New: "Is Order shippable" icon #1975.
|
||||
- New: statistics on supplier orders and invoices on home page.
|
||||
- New: Add permissions to read all trips and expenses.
|
||||
- New: Can filter on date into tab "Referring object" of a project.
|
||||
- New: Module notification has been enhanced:
|
||||
|
||||
@ -1,74 +1,81 @@
|
||||
dolibarr (3.6.1-3) unstable; urgency=low
|
||||
dolibarr (3.7.0-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Tue, 21 Oct 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.6.1-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Tue, 23 Sep 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.6.0-3) unstable; urgency=low
|
||||
dolibarr (3.6.0-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Tue, 15 July 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.5.5-3) unstable; urgency=low
|
||||
dolibarr (3.5.5-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Tue, 8 July 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.5.4-3) unstable; urgency=low
|
||||
dolibarr (3.5.4-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Tue, 1 July 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.5.3-3) unstable; urgency=low
|
||||
dolibarr (3.5.3-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Fri, 2 May 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.5.2-3) unstable; urgency=low
|
||||
dolibarr (3.5.2-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Fri, 14 March 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.5.1-3) unstable; urgency=low
|
||||
dolibarr (3.5.1-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Fri, 7 Feb 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.5.0-3) unstable; urgency=low
|
||||
dolibarr (3.5.0-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Fri, 31 Jan 2014 12:00:00 +0100
|
||||
|
||||
dolibarr (3.4.2-3) unstable; urgency=low
|
||||
dolibarr (3.4.2-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* Maintenance release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Mon, 30 Dec 2013 12:00:00 +0100
|
||||
|
||||
dolibarr (3.4.1-3) unstable; urgency=low
|
||||
dolibarr (3.4.1-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* Maintenance release.
|
||||
|
||||
-- Laurent Destailleur (eldy) <eldy@users.sourceforge.net> Mon, 27 Apr 2013 12:00:00 +0100
|
||||
|
||||
dolibarr (3.4.0-3) unstable; urgency=low
|
||||
dolibarr (3.4.0-3) UNRELEASED; urgency=low
|
||||
|
||||
[ Laurent Destailleur (eldy) ]
|
||||
* Maintenance release.
|
||||
|
||||
@ -17,9 +17,9 @@
|
||||
; ----- Change this -----
|
||||
AppName=DoliWamp
|
||||
; DoliWamp-x.x.x or DoliWamp-x.x.x-alpha or DoliWamp-x.x.x-beta or DoliWamp-x.x.x-rc or DoliWamp-x.x.x
|
||||
AppVerName=DoliWamp-3.6.1
|
||||
AppVerName=DoliWamp-3.7.0-beta
|
||||
; DoliWamp-x.x x or DoliWamp-x.x.x-alpha or DoliWamp-x.x.x-beta or DoliWamp-x.x.x-rc or DoliWamp-x.x.x
|
||||
OutputBaseFilename=DoliWamp-3.6.1
|
||||
OutputBaseFilename=DoliWamp-3.7.0-beta
|
||||
; ----- End of change
|
||||
;OutputManifestFile=build\doliwampbuild.log
|
||||
; Define full path from which all relative path are defined
|
||||
|
||||
@ -61,13 +61,17 @@ If you want to build/test package locally:
|
||||
|
||||
- List of series are visible here: https://launchpad.net/dolibarr/+series
|
||||
|
||||
# To update Dolibarr into launchpad (when repository for sources already exists)
|
||||
# To update Dolibarr into launchpad (when remote repository for sources already exists)
|
||||
#----------------------------------
|
||||
# create local repository
|
||||
cd bzr
|
||||
bzr branch lp:~yourlogin/dolibarr/[dev|beta|stable]
|
||||
bzr branch lp:~yourlogin/dolibarr/[develop|beta|stable] dolibarr-[dev|beta|stable]
|
||||
cd dolibarr-[dev|beta|stable]
|
||||
# Update
|
||||
bzr update
|
||||
-- Update files here. Remove all and overwrite --
|
||||
bzr status
|
||||
-- Update files here --
|
||||
bzr add *
|
||||
bzr commit -m "Description of change"
|
||||
bzr push
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -332,6 +332,9 @@ fi
|
||||
|
||||
# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release
|
||||
%changelog
|
||||
* Wed Oct 29 2014 Laurent Destailleur 3.7.0-0.3
|
||||
- Upstream release
|
||||
|
||||
* Wed Sep 24 2014 Laurent Destailleur 3.6.1-0.3
|
||||
- Upstream release
|
||||
|
||||
|
||||
@ -568,6 +568,9 @@ fi
|
||||
|
||||
# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release
|
||||
%changelog
|
||||
* Wed Oct 29 2014 Laurent Destailleur 3.7.0-0.3
|
||||
- Upstream release
|
||||
|
||||
* Wed Sep 24 2014 Laurent Destailleur 3.6.1-0.3
|
||||
- Upstream release
|
||||
|
||||
|
||||
@ -337,6 +337,9 @@ fi
|
||||
|
||||
# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release
|
||||
%changelog
|
||||
* Wed Oct 29 2014 Laurent Destailleur 3.7.0-0.3
|
||||
- Upstream release
|
||||
|
||||
* Wed Sep 24 2014 Laurent Destailleur 3.6.1-0.3
|
||||
- Upstream release
|
||||
|
||||
|
||||
@ -348,6 +348,9 @@ fi
|
||||
|
||||
# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release
|
||||
%changelog
|
||||
* Wed Oct 29 2014 Laurent Destailleur 3.7.0-0.3
|
||||
- Upstream release
|
||||
|
||||
* Wed Sep 24 2014 Laurent Destailleur 3.6.1-0.3
|
||||
- Upstream release
|
||||
|
||||
|
||||
@ -174,6 +174,8 @@ $message=$langs->trans("AgendaUrlOptions1",$user->login,$user->login).'<br>';
|
||||
$message.=$langs->trans("AgendaUrlOptions2",$user->login,$user->login).'<br>';
|
||||
$message.=$langs->trans("AgendaUrlOptions3",$user->login,$user->login).'<br>';
|
||||
$message.=$langs->trans("AgendaUrlOptions4",$user->login,$user->login).'<br>';
|
||||
$message.=$langs->trans("AgendaUrlOptionsProject",$user->login,$user->login);
|
||||
|
||||
print info_admin($message);
|
||||
|
||||
if (! empty($conf->use_javascript_ajax))
|
||||
|
||||
@ -222,6 +222,18 @@ else if ($action == 'set_COMMANDE_FREE_TEXT')
|
||||
}
|
||||
}
|
||||
|
||||
//Activate Set Shippable Icon In List
|
||||
else if ($action=="setshippableiconinlist") {
|
||||
$setshippableiconinlist = GETPOST('value','int');
|
||||
$res = dolibarr_set_const($db, "SHIPPABLE_ORDER_ICON_IN_LIST", $setshippableiconinlist,'yesno',0,'',$conf->entity);
|
||||
if (! $res > 0) $error++;
|
||||
if (! $error) {
|
||||
setEventMessage($langs->trans("SetupSaved"));
|
||||
} else {
|
||||
setEventMessage($langs->trans("Error"), 'errors');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* View
|
||||
@ -548,6 +560,22 @@ print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'
|
||||
print "</td></tr>\n";
|
||||
print '</form>';
|
||||
|
||||
// Shippable Icon in List
|
||||
$var=!$var;
|
||||
print "<tr ".$bc[$var].">";
|
||||
print '<td>'.$langs->trans("ShippableOrderIconInList").'</td>';
|
||||
print '<td> </td>';
|
||||
print '<td align="center">';
|
||||
if (!empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST)) {
|
||||
print '<a href="'.$_SERVER['PHP_SELF'].'?action=setshippableiconinlist&value=0">';
|
||||
print img_picto($langs->trans("Activated"),'switch_on');
|
||||
} else {
|
||||
print '<a href="'.$_SERVER['PHP_SELF'].'?action=setshippableiconinlist&value=1">';
|
||||
print img_picto($langs->trans("Disabled"),'switch_off');
|
||||
}
|
||||
print '</a></td>';
|
||||
print '</tr>';
|
||||
|
||||
print '</table>';
|
||||
|
||||
print '<br>';
|
||||
|
||||
@ -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,23,12,13,0,14,0,7,17,0,22,20,18,21,0,15,0,24);
|
||||
$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,0,25);
|
||||
|
||||
// Name of SQL tables of dictionaries
|
||||
$tabname=array();
|
||||
@ -98,6 +98,7 @@ $tabname[21]= MAIN_DB_PREFIX."c_availability";
|
||||
$tabname[22]= MAIN_DB_PREFIX."c_input_reason";
|
||||
$tabname[23]= MAIN_DB_PREFIX."c_revenuestamp";
|
||||
$tabname[24]= MAIN_DB_PREFIX."c_type_resource";
|
||||
$tabname[25]= MAIN_DB_PREFIX."c_email_templates";
|
||||
|
||||
// Dictionary labels
|
||||
$tablib=array();
|
||||
@ -125,6 +126,7 @@ $tablib[21]= "DictionaryAvailability";
|
||||
$tablib[22]= "DictionarySource";
|
||||
$tablib[23]= "DictionaryRevenueStamp";
|
||||
$tablib[24]= "DictionaryResourceType";
|
||||
$tablib[25]= "DictionaryEMailTemplates";
|
||||
|
||||
// Requests to extract data
|
||||
$tabsql=array();
|
||||
@ -152,6 +154,7 @@ $tabsql[21]= "SELECT c.rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX
|
||||
$tabsql[22]= "SELECT rowid as rowid, code, label, active FROM ".MAIN_DB_PREFIX."c_input_reason";
|
||||
$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";
|
||||
$tabsql[25]= "SELECT rowid as rowid, label, type_template, private, position, topic, content, active FROM ".MAIN_DB_PREFIX."c_email_templates";
|
||||
|
||||
// Criteria to sort dictionaries
|
||||
$tabsqlsort=array();
|
||||
@ -179,6 +182,7 @@ $tabsqlsort[21]="code ASC, label ASC";
|
||||
$tabsqlsort[22]="code ASC, label ASC";
|
||||
$tabsqlsort[23]="country ASC, taux ASC";
|
||||
$tabsqlsort[24]="code ASC,label ASC";
|
||||
$tabsqlsort[25]="label ASC";
|
||||
|
||||
// Nom des champs en resultat de select pour affichage du dictionnaire
|
||||
$tabfield=array();
|
||||
@ -206,6 +210,7 @@ $tabfield[21]= "code,label";
|
||||
$tabfield[22]= "code,label";
|
||||
$tabfield[23]= "country_id,country,taux,accountancy_code_sell,accountancy_code_buy,note";
|
||||
$tabfield[24]= "code,label";
|
||||
$tabfield[25]= "label,type_template,private,position,topic,content";
|
||||
|
||||
// Nom des champs d'edition pour modification d'un enregistrement
|
||||
$tabfieldvalue=array();
|
||||
@ -233,6 +238,7 @@ $tabfieldvalue[21]= "code,label";
|
||||
$tabfieldvalue[22]= "code,label";
|
||||
$tabfieldvalue[23]= "country,taux,accountancy_code_sell,accountancy_code_buy,note";
|
||||
$tabfieldvalue[24]= "code,label";
|
||||
$tabfieldvalue[25]= "label,type_template,private,position,topic,content";
|
||||
|
||||
// Nom des champs dans la table pour insertion d'un enregistrement
|
||||
$tabfieldinsert=array();
|
||||
@ -260,6 +266,7 @@ $tabfieldinsert[21]= "code,label";
|
||||
$tabfieldinsert[22]= "code,label";
|
||||
$tabfieldinsert[23]= "fk_pays,taux,accountancy_code_sell,accountancy_code_buy,note";
|
||||
$tabfieldinsert[24]= "code,label";
|
||||
$tabfieldinsert[25]= "label,type_template,private,position,topic,content";
|
||||
|
||||
// Nom du rowid si le champ n'est pas de type autoincrement
|
||||
// Example: "" if id field is "rowid" and has autoincrement on
|
||||
@ -288,7 +295,8 @@ $tabrowid[20]= "";
|
||||
$tabrowid[21]= "rowid";
|
||||
$tabrowid[22]= "rowid";
|
||||
$tabrowid[23]= "";
|
||||
$tabrowid[23]= "";
|
||||
$tabrowid[24]= "";
|
||||
$tabrowid[25]= "";
|
||||
|
||||
// Condition to show dictionary in setup page
|
||||
$tabcond=array();
|
||||
@ -316,6 +324,7 @@ $tabcond[21]= ! empty($conf->propal->enabled);
|
||||
$tabcond[22]= (! empty($conf->commande->enabled) || ! empty($conf->propal->enabled));
|
||||
$tabcond[23]= true;
|
||||
$tabcond[24]= ! empty($conf->resource->enabled);
|
||||
$tabcond[25]= true; // && ! empty($conf->global->MAIN_EMAIL_EDIT_TEMPLATE_FROM_DIC);
|
||||
|
||||
// List of help for fields
|
||||
$tabhelp=array();
|
||||
@ -343,6 +352,7 @@ $tabhelp[21] = array();
|
||||
$tabhelp[22] = array();
|
||||
$tabhelp[23] = array();
|
||||
$tabhelp[24] = array();
|
||||
$tabhelp[25] = array();
|
||||
|
||||
// List of check for fields (NOT USED YET)
|
||||
$tabfieldcheck=array();
|
||||
@ -370,6 +380,7 @@ $tabfieldcheck[21] = array();
|
||||
$tabfieldcheck[22] = array();
|
||||
$tabfieldcheck[23] = array();
|
||||
$tabfieldcheck[24] = array();
|
||||
$tabfieldcheck[25] = 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);
|
||||
@ -442,7 +453,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify'))
|
||||
$ok=1;
|
||||
foreach ($listfield as $f => $value)
|
||||
{
|
||||
if ($value == 'country' && in_array($tablib[$id],array('DictionaryRegion','DictionaryCompanyType'))) continue; // For some pages, country is not mandatory
|
||||
if ($value == 'country' && in_array($tablib[$id],array('DictionaryCanton','DictionaryCompanyType'))) continue; // For some pages, country is not mandatory
|
||||
if ($value == 'country_id' && in_array($tablib[$id],array('DictionaryRegion','DictionaryCompanyType'))) continue; // For some pages, country is not mandatory
|
||||
if ($value == 'localtax1' && empty($_POST['localtax1_type'])) continue;
|
||||
if ($value == 'localtax2' && empty($_POST['localtax2_type'])) continue;
|
||||
@ -489,7 +500,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify'))
|
||||
$msg .= $langs->transnoentities('ErrorFieldFormat', $langs->transnoentities('Code')).'<br />';
|
||||
}*/
|
||||
}
|
||||
if (isset($_POST["country"]) && $_POST["country"]=='0')
|
||||
if (isset($_POST["country"]) && ($_POST["country"]=='0') && ($id != 2))
|
||||
{
|
||||
if (in_array($tablib[$id],array('DictionaryCompanyType')))
|
||||
{
|
||||
@ -533,6 +544,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify'))
|
||||
$sql.= $tabfieldinsert[$id];
|
||||
$sql.=",active)";
|
||||
$sql.= " VALUES(";
|
||||
|
||||
// List of values
|
||||
if ($tabrowid[$id] && ! in_array($tabrowid[$id],$listfieldinsert))
|
||||
$sql.= $newid.",";
|
||||
@ -846,6 +858,13 @@ if ($id)
|
||||
if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); }
|
||||
if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); }
|
||||
if ($fieldlist[$field]=='sortorder') { $valuetoshow=$langs->trans("SortOrder"); }
|
||||
|
||||
if ($id == 2) // Special cas for state page
|
||||
{
|
||||
if ($fieldlist[$field]=='region_id') { $valuetoshow=' '; $showfield=1; }
|
||||
if ($fieldlist[$field]=='region') { $valuetoshow=$langs->trans("Country").'/'.$langs->trans("Region"); $showfield=1; }
|
||||
}
|
||||
|
||||
if ($valuetoshow != '')
|
||||
{
|
||||
print '<td align="'.$align.'">';
|
||||
@ -856,12 +875,14 @@ if ($id)
|
||||
}
|
||||
if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') $alabelisused=1;
|
||||
}
|
||||
|
||||
if ($id == 4) print '<td></td>';
|
||||
print '<td colspan="4">';
|
||||
print '<input type="hidden" name="id" value="'.$id.'">';
|
||||
print ' </td>';
|
||||
print '</tr>';
|
||||
|
||||
// Line to type new values
|
||||
// Line to enter new values
|
||||
print "<tr ".$bc[$var].">";
|
||||
|
||||
$obj = new stdClass();
|
||||
@ -880,16 +901,25 @@ if ($id)
|
||||
$reshook=$hookmanager->executeHooks('createDictionaryFieldlist',$parameters, $obj, $tmpaction); // Note that $action and $object may have been modified by some hooks
|
||||
$error=$hookmanager->error; $errors=$hookmanager->errors;
|
||||
|
||||
if ($id == 3)
|
||||
{
|
||||
unset($fieldlist[2]);
|
||||
}
|
||||
|
||||
if (empty($reshook)) fieldList($fieldlist,$obj);
|
||||
|
||||
if ($id == 4) print '<td></td>';
|
||||
print '<td colspan="3" align="right"><input type="submit" class="button" name="actionadd" value="'.$langs->trans("Add").'"></td>';
|
||||
print "</tr>";
|
||||
|
||||
$colspan=count($fieldlist)+2;
|
||||
if ($id == 4) $colspan++;;
|
||||
|
||||
if (! empty($alabelisused)) // Si un des champs est un libelle
|
||||
{
|
||||
print '<tr><td colspan="'.(count($fieldlist)+2).'">* '.$langs->trans("LabelUsedByDefault").'.</td></tr>';
|
||||
print '<tr><td colspan="'.$colspan.'">* '.$langs->trans("LabelUsedByDefault").'.</td></tr>';
|
||||
}
|
||||
print '<tr><td colspan="'.(count($fieldlist)+2).'"> </td></tr>';
|
||||
print '<tr><td colspan="'.$colspan.'"> </td></tr>';
|
||||
}
|
||||
|
||||
print '</form>';
|
||||
@ -965,6 +995,7 @@ if ($id)
|
||||
if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); }
|
||||
if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); }
|
||||
if ($fieldlist[$field]=='sortorder') { $valuetoshow=$langs->trans("SortOrder"); }
|
||||
|
||||
// Affiche nom du champ
|
||||
if ($showfield)
|
||||
{
|
||||
@ -1302,7 +1333,7 @@ $db->close();
|
||||
|
||||
|
||||
/**
|
||||
* Show field
|
||||
* Show fields in insert/edit mode
|
||||
*
|
||||
* @param array $fieldlist Array of fields
|
||||
* @param Object $obj If we show a particular record, obj is filled with record fields
|
||||
@ -1322,14 +1353,22 @@ function fieldList($fieldlist,$obj='',$tabname='')
|
||||
foreach ($fieldlist as $field => $value)
|
||||
{
|
||||
if ($fieldlist[$field] == 'country') {
|
||||
if (in_array('region_id',$fieldlist)) { print '<td>'.join(',',$fieldlist).' </td>'; continue; } // For state page, we do not show the country input (we link to region, not country)
|
||||
if (in_array('region_id',$fieldlist))
|
||||
{
|
||||
print '<td>';
|
||||
//print join(',',$fieldlist);
|
||||
print '</td>';
|
||||
continue;
|
||||
} // For state page, we do not show the country input (we link to region, not country)
|
||||
print '<td>';
|
||||
print $form->select_country((! empty($obj->country_code)?$obj->country_code:(! empty($obj->country)?$obj->country:'')), 'country', '', 28);
|
||||
print '</td>';
|
||||
}
|
||||
elseif ($fieldlist[$field] == 'country_id') {
|
||||
$country_id = (! empty($obj->$fieldlist[$field]) ? $obj->$fieldlist[$field] : 0);
|
||||
print '<td>';
|
||||
print '<input type="hidden" name="'.$fieldlist[$field].'" value="'.$country_id.'">';
|
||||
print '</td>';
|
||||
}
|
||||
elseif ($fieldlist[$field] == 'region') {
|
||||
print '<td>';
|
||||
@ -1338,7 +1377,9 @@ function fieldList($fieldlist,$obj='',$tabname='')
|
||||
}
|
||||
elseif ($fieldlist[$field] == 'region_id') {
|
||||
$region_id = (! empty($obj->$fieldlist[$field])?$obj->$fieldlist[$field]:0);
|
||||
print '<td>';
|
||||
print '<input type="hidden" name="'.$fieldlist[$field].'" value="'.$region_id.'">';
|
||||
print '</td>';
|
||||
}
|
||||
elseif ($fieldlist[$field] == 'lang') {
|
||||
print '<td>';
|
||||
@ -1377,7 +1418,7 @@ function fieldList($fieldlist,$obj='',$tabname='')
|
||||
print '<input type="text" class="flat" value="'.(isset($obj->$fieldlist[$field])?$obj->$fieldlist[$field]:'').'" size="3" name="'.$fieldlist[$field].'">';
|
||||
print '</td>';
|
||||
}
|
||||
elseif ($fieldlist[$field] == 'libelle_facture') {
|
||||
elseif (in_array($fieldlist[$field], array('libelle_facture','content'))) {
|
||||
print '<td><textarea cols="30" rows="'.ROWS_2.'" class="flat" name="'.$fieldlist[$field].'">'.(! empty($obj->$fieldlist[$field])?$obj->$fieldlist[$field]:'').'</textarea></td>';
|
||||
}
|
||||
elseif ($fieldlist[$field] == 'price' || preg_match('/^amount/i',$fieldlist[$field])) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<?php
|
||||
/* Copyright (C) 2004-2013 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||
/* Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -229,10 +229,11 @@ if ($result)
|
||||
// Description
|
||||
print '<td>';
|
||||
$text=$langs->trans($obj->description);
|
||||
if (preg_match('/\((.*)\)/i',$obj->description,$reg))
|
||||
if (preg_match('/\((.*)\)(.*)/i',$obj->description,$reg))
|
||||
{
|
||||
$val=explode(',',$reg[1]);
|
||||
$text=$langs->trans($val[0], isset($val[1])?$val[1]:'', isset($val[2])?$val[2]:'', isset($val[3])?$val[3]:'', isset($val[4])?$val[4]:'');
|
||||
if (! empty($reg[2])) $text.=$reg[2];
|
||||
}
|
||||
print $text;
|
||||
print '</td>';
|
||||
|
||||
@ -251,11 +251,11 @@ if ($action == 'add')
|
||||
if (! empty($conf->phenix->enabled) && GETPOST('add_phenix') == 'on') $object->use_phenix=1;
|
||||
|
||||
// Check parameters
|
||||
if (empty($object->userownerid))
|
||||
if (empty($object->userownerid) && empty($_SESSION['assignedtouser']))
|
||||
{
|
||||
$error++; $donotclearsession=1;
|
||||
$action = 'create';
|
||||
setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("ActionAffectedTo")), 'errors');
|
||||
setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("ActionsOwnedBy")), 'errors');
|
||||
}
|
||||
if ($object->type_code == 'AC_RDV' && ($datep == '' || ($datef == '' && empty($fulldayevent))))
|
||||
{
|
||||
@ -423,7 +423,7 @@ if ($action == 'update')
|
||||
{
|
||||
$error++; $donotclearsession=1;
|
||||
$action = 'edit';
|
||||
setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("ActionAffectedTo")), 'errors');
|
||||
setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("ActionsOwnedBy")), 'errors');
|
||||
}
|
||||
|
||||
// Fill array 'array_options' with data from add form
|
||||
@ -790,11 +790,11 @@ if ($id > 0)
|
||||
{
|
||||
$result1=$object->fetch($id);
|
||||
$result2=$object->fetch_thirdparty();
|
||||
$result2=$object->fetch_contact();
|
||||
$result3=$object->fetch_userassigned();
|
||||
$result4=$object->fetch_optionals($id,$extralabels);
|
||||
$result3=$object->fetch_contact();
|
||||
$result4=$object->fetch_userassigned();
|
||||
$result5=$object->fetch_optionals($id,$extralabels);
|
||||
|
||||
if ($result1 < 0 || $result2 < 0 || $result3 < 0 || $result4 < 0)
|
||||
if ($result1 < 0 || $result2 < 0 || $result3 < 0 || $result4 < 0 || $result5 < 0)
|
||||
{
|
||||
dol_print_error($db,$object->error);
|
||||
exit;
|
||||
|
||||
@ -987,6 +987,7 @@ class ActionComm extends CommonObject
|
||||
if ($key == 'id') $sql.=" AND a.id=".(is_numeric($value)?$value:0);
|
||||
if ($key == 'idfrom') $sql.=" AND a.id >= ".(is_numeric($value)?$value:0);
|
||||
if ($key == 'idto') $sql.=" AND a.id <= ".(is_numeric($value)?$value:0);
|
||||
if ($key == 'project') $sql.=" AND a.fk_project=".(is_numeric($value)?$value:0);
|
||||
if ($key == 'login')
|
||||
{
|
||||
$login=$value;
|
||||
|
||||
@ -1,258 +0,0 @@
|
||||
<?php
|
||||
/* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
||||
* Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
|
||||
* Copyright (C) 2012 Philippe Grand <philippe.grand@atoo-net.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file htdocs/comm/action/contact.php
|
||||
* \ingroup agenda
|
||||
* \brief Page for multi-users event
|
||||
*/
|
||||
|
||||
require '../../main.inc.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
|
||||
|
||||
$langs->load("companies");
|
||||
$langs->load("commercial");
|
||||
$langs->load("other");
|
||||
$langs->load("bills");
|
||||
|
||||
$id = GETPOST('id','int');
|
||||
$action = GETPOST('action','alpha');
|
||||
$ref = GETPOST('ref');
|
||||
$confirm = GETPOST('confirm');
|
||||
$lineid = GETPOST('lineid','int');
|
||||
|
||||
// Security check
|
||||
$socid = GETPOST('socid','int');
|
||||
if ($user->societe_id) $socid=$user->societe_id;
|
||||
if ($user->societe_id > 0)
|
||||
{
|
||||
unset($_GET["action"]);
|
||||
$action='';
|
||||
}
|
||||
$result = restrictedArea($user, 'agenda', $objectid, 'actioncomm&societe', 'myactions|allactions', 'fk_soc', 'id');
|
||||
|
||||
|
||||
$object = new ActionComm($db);
|
||||
|
||||
|
||||
/*
|
||||
* Actions
|
||||
*/
|
||||
|
||||
// Add new contact
|
||||
if ($action == 'addcontact' && $user->rights->action->creer)
|
||||
{
|
||||
$result = $object->fetch($id);
|
||||
|
||||
if ($object->id > 0)
|
||||
{
|
||||
$contactid = (GETPOST('userid','int') ? GETPOST('userid','int') : GETPOST('contactid','int'));
|
||||
$result = $object->add_contact($contactid, $_POST["type"], $_POST["source"]);
|
||||
}
|
||||
|
||||
if ($result >= 0)
|
||||
{
|
||||
header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
|
||||
exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS')
|
||||
{
|
||||
$langs->load("errors");
|
||||
setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors');
|
||||
}
|
||||
else
|
||||
{
|
||||
setEventMessage($object->error, 'errors');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// modification d'un contact. On enregistre le type
|
||||
if ($action == 'updateline')
|
||||
{
|
||||
if ($object->fetch($id))
|
||||
{
|
||||
$contact = $object->detail_contact($_POST["line"]);
|
||||
$type = $_POST["type"];
|
||||
$statut = $contact->statut;
|
||||
|
||||
$result = $object->update_contact($_POST["line"], $statut, $type);
|
||||
if ($result >= 0)
|
||||
{
|
||||
$db->commit();
|
||||
} else
|
||||
{
|
||||
dol_print_error($db, "result=$result");
|
||||
$db->rollback();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
setEventMessage($object->error, 'errors');
|
||||
}
|
||||
}
|
||||
|
||||
// Bascule du statut d'un contact
|
||||
else if ($action == 'swapstatut')
|
||||
{
|
||||
if ($object->id > 0)
|
||||
{
|
||||
$result=$object->swapContactStatus(GETPOST('ligne'));
|
||||
}
|
||||
}
|
||||
|
||||
// Efface un contact
|
||||
else if ($action == 'deletecontact')
|
||||
{
|
||||
$result = $object->delete_contact($lineid);
|
||||
|
||||
if ($result >= 0)
|
||||
{
|
||||
header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
|
||||
exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
dol_print_error($db);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* View
|
||||
*/
|
||||
|
||||
$form = new Form($db);
|
||||
$formcompany= new FormCompany($db);
|
||||
|
||||
$contactstatic=new Contact($db);
|
||||
$userstatic=new User($db);
|
||||
|
||||
$help_url='EN:Module_Agenda_En|FR:Module_Agenda|ES:M&omodulodulo_Agenda';
|
||||
llxHeader('',$langs->trans("Agenda"),$help_url);
|
||||
|
||||
|
||||
if ($id > 0 || ! empty($ref))
|
||||
{
|
||||
if ($object->fetch($id,$ref) > 0)
|
||||
{
|
||||
|
||||
$head=actions_prepare_head($object);
|
||||
dol_fiche_head($head, 'contact', $langs->trans("Action"),0,'action');
|
||||
|
||||
// Affichage fiche action en mode visu
|
||||
print '<table class="border" width="100%">';
|
||||
|
||||
$linkback = '<a href="'.DOL_URL_ROOT.'/comm/action/index.php">'.$langs->trans("BackToList").'</a>';
|
||||
|
||||
// Ref
|
||||
print '<tr><td width="30%">'.$langs->trans("Ref").'</td><td colspan="3">';
|
||||
print $form->showrefnav($object, 'id', $linkback, ($user->societe_id?0:1), 'id', 'ref', '');
|
||||
print '</td></tr>';
|
||||
|
||||
// Type
|
||||
if (! empty($conf->global->AGENDA_USE_EVENT_TYPE))
|
||||
{
|
||||
print '<tr><td>'.$langs->trans("Type").'</td><td colspan="3">'.$object->type.'</td></tr>';
|
||||
}
|
||||
|
||||
// Title
|
||||
print '<tr><td>'.$langs->trans("Title").'</td><td colspan="3">'.$object->label.'</td></tr>';
|
||||
|
||||
// Full day event
|
||||
print '<tr><td>'.$langs->trans("EventOnFullDay").'</td><td colspan="3">'.yn($object->fulldayevent).'</td></tr>';
|
||||
|
||||
// Date start
|
||||
print '<tr><td width="30%">'.$langs->trans("DateActionStart").'</td><td colspan="2">';
|
||||
if (! $object->fulldayevent) print dol_print_date($object->datep,'dayhour');
|
||||
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 '</td>';
|
||||
print '<td rowspan="4" align="center" valign="middle" width="180">'."\n";
|
||||
print '<form name="listactionsfiltermonth" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_month">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendar').' <input type="submit" style="width: 120px" class="button" name="viewcal" value="'.$langs->trans("ViewCal").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterweek" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_week">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarweek').' <input type="submit" style="width: 120px" class="button" name="viewweek" value="'.$langs->trans("ViewWeek").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterday" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_day">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarday').' <input type="submit" style="width: 120px" class="button" name="viewday" value="'.$langs->trans("ViewDay").'">';
|
||||
print '</form>'."\n";
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
|
||||
// Date end
|
||||
print '<tr><td>'.$langs->trans("DateActionEnd").'</td><td colspan="2">';
|
||||
if (! $object->fulldayevent) print dol_print_date($object->datef,'dayhour');
|
||||
else print dol_print_date($object->datef,'day');
|
||||
if ($object->percentage > 0 && $object->percentage < 100 && $object->datef && $object->datef < ($now- $delay_warning)) print img_warning($langs->trans("Late"));
|
||||
print '</td></tr>';
|
||||
|
||||
// Location
|
||||
print '<tr><td>'.$langs->trans("Location").'</td><td colspan="2">'.$object->location.'</td></tr>';
|
||||
|
||||
print '</table>';
|
||||
|
||||
dol_fiche_end();
|
||||
|
||||
print '<br>';
|
||||
|
||||
// Contacts lines (modules that overwrite templates must declare this into descriptor)
|
||||
$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
|
||||
foreach($dirtpls as $reldir)
|
||||
{
|
||||
$res=@include dol_buildpath($reldir.'/contacts.tpl.php');
|
||||
if ($res) break;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
print "ErrorRecordNotFound";
|
||||
}
|
||||
}
|
||||
|
||||
llxFooter();
|
||||
|
||||
$db->close();
|
||||
|
||||
@ -41,7 +41,7 @@ $langs->load("commercial");
|
||||
$langs->load("other");
|
||||
$langs->load("bills");
|
||||
|
||||
$objectid = GETPOST('id', 'int');
|
||||
$id = GETPOST('id', 'int');
|
||||
$action=GETPOST('action', 'alpha');
|
||||
$confirm = GETPOST('confirm', 'alpha');
|
||||
|
||||
@ -53,13 +53,13 @@ if ($user->societe_id > 0)
|
||||
unset($_GET["action"]);
|
||||
$action='';
|
||||
}
|
||||
$result = restrictedArea($user, 'agenda', $objectid, 'actioncomm&societe', 'myactions|allactions', 'fk_soc', 'id');
|
||||
$result = restrictedArea($user, 'agenda', $id, 'actioncomm&societe', 'myactions|allactions', 'fk_soc', 'id');
|
||||
|
||||
$object = new ActionComm($db);
|
||||
|
||||
if ($objectid > 0)
|
||||
if ($id > 0)
|
||||
{
|
||||
$ret = $object->fetch($objectid);
|
||||
$ret = $object->fetch($id);
|
||||
$object->fetch_thirdparty();
|
||||
}
|
||||
|
||||
@ -96,11 +96,25 @@ llxHeader('',$langs->trans("Agenda"),$help_url);
|
||||
|
||||
if ($object->id > 0)
|
||||
{
|
||||
$result1=$object->fetch($id);
|
||||
$result2=$object->fetch_thirdparty();
|
||||
$result3=$object->fetch_contact();
|
||||
$result4=$object->fetch_userassigned();
|
||||
$result5=$object->fetch_optionals($id,$extralabels);
|
||||
|
||||
if ($result1 < 0 || $result2 < 0 || $result3 < 0 || $result4 < 0 || $result5 < 0)
|
||||
{
|
||||
dol_print_error($db,$object->error);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($object->authorid > 0) { $tmpuser=new User($db); $res=$tmpuser->fetch($object->authorid); $object->author=$tmpuser; }
|
||||
if ($object->usermodid > 0) { $tmpuser=new User($db); $res=$tmpuser->fetch($object->usermodid); $object->usermod=$tmpuser; }
|
||||
|
||||
$author=new User($db);
|
||||
$author->fetch($object->author->id);
|
||||
$object->author=$author;
|
||||
|
||||
$object->fetch_contact();
|
||||
|
||||
$head=actions_prepare_head($object);
|
||||
|
||||
@ -132,53 +146,15 @@ if ($object->id > 0)
|
||||
print '<tr><td>'.$langs->trans("EventOnFullDay").'</td><td colspan="3">'.yn($object->fulldayevent).'</td></tr>';
|
||||
|
||||
// Date start
|
||||
print '<tr><td width="30%">'.$langs->trans("DateActionStart").'</td><td colspan="2">';
|
||||
print '<tr><td width="30%">'.$langs->trans("DateActionStart").'</td><td colspan="3">';
|
||||
if (! $object->fulldayevent) print dol_print_date($object->datep,'dayhour');
|
||||
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 '</td>';
|
||||
print '<td rowspan="5" align="center" valign="middle" width="180">'."\n";
|
||||
print '<form name="listactionsfiltermonth" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_month">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendar','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewcal" value="'.$langs->trans("ViewCal").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterweek" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_week">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarweek','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewweek" value="'.$langs->trans("ViewWeek").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterday" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_day">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarday','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewday" value="'.$langs->trans("ViewDay").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterperuser" action="'.DOL_URL_ROOT.'/comm/action/peruser.php" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_peruser">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarperuser','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewperuser" value="'.$langs->trans("ViewPerUser").'">';
|
||||
print '</form>'."\n";
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
|
||||
// Date end
|
||||
print '<tr><td>'.$langs->trans("DateActionEnd").'</td><td colspan="2">';
|
||||
print '<tr><td>'.$langs->trans("DateActionEnd").'</td><td colspan="3">';
|
||||
if (! $object->fulldayevent) print dol_print_date($object->datef,'dayhour');
|
||||
else print dol_print_date($object->datef,'day');
|
||||
if ($object->percentage > 0 && $object->percentage < 100 && $object->datef && $object->datef < ($now- $delay_warning)) print img_warning($langs->trans("Late"));
|
||||
@ -190,16 +166,38 @@ if ($object->id > 0)
|
||||
print '</td></tr>';
|
||||
|
||||
// Location
|
||||
print '<tr><td>'.$langs->trans("Location").'</td><td colspan="2">'.$object->location.'</td></tr>';
|
||||
if (empty($conf->global->AGENDA_DISABLE_LOCATION))
|
||||
{
|
||||
print '<tr><td>'.$langs->trans("Location").'</td><td colspan="3">'.$object->location.'</td></tr>';
|
||||
}
|
||||
|
||||
// Assigned to
|
||||
print '<tr><td width="30%" class="nowrap">'.$langs->trans("ActionAffectedTo").'</td><td>';
|
||||
if ($object->userownerid > 0)
|
||||
print '<tr><td width="30%" class="nowrap">'.$langs->trans("ActionAffectedTo").'</td><td colspan="3">';
|
||||
$listofuserid=array();
|
||||
if (empty($donotclearsession))
|
||||
{
|
||||
$tmpuser=new User($object->userownerid);
|
||||
print $tmpuser->getNomUrl(1);
|
||||
if ($object->userownerid > 0) $listofuserid[$object->userownerid]=array('id'=>$object->userownerid,'transparency'=>$object->transparency); // Owner first
|
||||
if (! empty($object->userassigned)) // Now concat assigned users
|
||||
{
|
||||
// Restore array with key with same value than param 'id'
|
||||
$tmplist1=$object->userassigned; $tmplist2=array();
|
||||
foreach($tmplist1 as $key => $val)
|
||||
{
|
||||
if ($val['id'] && $val['id'] != $object->userownerid) $listofuserid[$val['id']]=$val;
|
||||
}
|
||||
}
|
||||
$_SESSION['assignedtouser']=dol_json_encode($listofuserid);
|
||||
}
|
||||
print '</td></tr>';
|
||||
else
|
||||
{
|
||||
if (!empty($_SESSION['assignedtouser']))
|
||||
{
|
||||
$listofuserid=dol_json_decode($_SESSION['assignedtouser'], true);
|
||||
}
|
||||
}
|
||||
print $form->select_dolusers_forevent('view','assignedtouser',1);
|
||||
if (in_array($user->id,array_keys($listofuserid))) print $langs->trans("MyAvailability").': '.(($object->userassigned[$user->id]['transparency'] > 0)?$langs->trans("Busy"):$langs->trans("Available")); // We show nothing if event is assigned to nobody
|
||||
print ' </td></tr>';
|
||||
|
||||
print '</table><br><br><table class="border" width="100%">';
|
||||
|
||||
@ -252,8 +250,20 @@ if ($object->id > 0)
|
||||
print ($object->priority?$object->priority:'');
|
||||
print '</td></tr>';
|
||||
|
||||
// Other attributes
|
||||
$parameters=array('colspan'=>' colspan="3"', 'colspanvalue'=>'3', 'id'=>$object->id);
|
||||
$reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
|
||||
if (empty($reshook) && ! empty($extrafields->attribute_label))
|
||||
{
|
||||
print $object->showOptionals($extrafields,'edit');
|
||||
}
|
||||
|
||||
print '</table><br><br><table class="border" width="100%">';
|
||||
|
||||
print '</table>';
|
||||
|
||||
print '<br><br>';
|
||||
|
||||
print '<table class="border" width="100%">';
|
||||
|
||||
// Construit liste des fichiers
|
||||
$filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
|
||||
@ -266,7 +276,8 @@ if ($object->id > 0)
|
||||
|
||||
print '<tr><td width="30%" nowrap>'.$langs->trans("NbOfAttachedFiles").'</td><td colspan="3">'.count($filearray).'</td></tr>';
|
||||
print '<tr><td>'.$langs->trans("TotalSizeOfAttachedFiles").'</td><td colspan="3">'.$totalsize.' '.$langs->trans("bytes").'</td></tr>';
|
||||
print '</table>';
|
||||
|
||||
print '</table>';
|
||||
|
||||
print '</div>';
|
||||
|
||||
@ -274,6 +285,52 @@ if ($object->id > 0)
|
||||
$permission = $user->rights->agenda->myactions->create||$user->rights->agenda->allactions->create;
|
||||
$param = '&id=' . $object->id;
|
||||
include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php';
|
||||
|
||||
|
||||
if ($action != 'edit')
|
||||
{
|
||||
print "<br>";
|
||||
|
||||
// Link to agenda views
|
||||
print '<div id="agendaviewbutton">';
|
||||
print '<form name="listactionsfiltermonth" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST" style="float: left; padding-right: 10px;">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_month">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendar','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewcal" value="'.$langs->trans("ViewCal").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterweek" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST" style="float: left; padding-right: 10px;">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_week">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarweek','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewweek" value="'.$langs->trans("ViewWeek").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterday" action="'.DOL_URL_ROOT.'/comm/action/index.php" method="POST" style="float: left; padding-right: 10px;">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_day">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarday','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewday" value="'.$langs->trans("ViewDay").'">';
|
||||
print '</form>'."\n";
|
||||
print '<form name="listactionsfilterperuser" action="'.DOL_URL_ROOT.'/comm/action/peruser.php" method="POST" style="float: left; padding-right: 10px;">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="show_peruser">';
|
||||
print '<input type="hidden" name="year" value="'.dol_print_date($object->datep,'%Y').'">';
|
||||
print '<input type="hidden" name="month" value="'.dol_print_date($object->datep,'%m').'">';
|
||||
print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
//print '<input type="hidden" name="day" value="'.dol_print_date($object->datep,'%d').'">';
|
||||
print img_picto($langs->trans("ViewCal"),'object_calendarperuser','class="hideonsmartphone"').' <input type="submit" style="min-width: 120px" class="button" name="viewperuser" value="'.$langs->trans("ViewPerUser").'">';
|
||||
print '</form>'."\n";
|
||||
print '</div>';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -118,6 +118,23 @@ if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire)
|
||||
print "<br>";
|
||||
}
|
||||
|
||||
// Search contract
|
||||
if (! empty($conf->ficheinter->enabled) && $user->rights->ficheinter->lire)
|
||||
{
|
||||
$var=false;
|
||||
print '<form method="post" action="'.DOL_URL_ROOT.'/fichinter/list.php">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<table class="noborder nohover" width="100%">';
|
||||
print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("SearchAnIntervention").'</td></tr>';
|
||||
print '<tr '.$bc[$var].'>';
|
||||
print '<td class="nowrap"><label for="search_contract">'.$langs->trans("Ref").'</label>:</td><td><input type="text" class="flat" name="search_inter" id="search_inter" size="18"></td>';
|
||||
print '<td rowspan="2"><input type="submit" value="'.$langs->trans("Search").'" class="button"></td></tr>';
|
||||
print '<tr '.$bc[$var].'><td class="nowrap"><label for="sall">'.$langs->trans("Other").'</label>:</td><td><input type="text" class="flat" name="sall" id="sall" size="18"></td>';
|
||||
print '</tr>';
|
||||
print "</table></form>\n";
|
||||
print "<br>";
|
||||
}
|
||||
|
||||
/*
|
||||
* Draft proposals
|
||||
*/
|
||||
|
||||
@ -535,7 +535,7 @@ else if ($action == 'classifybilled' && $user->rights->propal->cloturer) {
|
||||
// Reopen proposal
|
||||
else if ($action == 'confirm_reopen' && $user->rights->propal->cloturer && ! GETPOST('cancel')) {
|
||||
// prevent browser refresh from reopening proposal several times
|
||||
if ($object->statut == 2 || $object->statut == 3) {
|
||||
if ($object->statut == 2 || $object->statut == 3 || $object->statut == 4) {
|
||||
$object->reopen($user, 1);
|
||||
}
|
||||
}
|
||||
@ -617,11 +617,12 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G
|
||||
else
|
||||
$subject = $langs->transnoentities('Propal') . ' ' . $object->ref;
|
||||
$actiontypecode = 'AC_PROP';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto . ".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto;
|
||||
if ($message) {
|
||||
$actionmsg .= $langs->transnoentities('MailTopic') . ": " . $subject . "\n";
|
||||
$actionmsg .= $langs->transnoentities('TextUsedInTheMessageBody') . ":\n";
|
||||
$actionmsg .= $message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
$actionmsg2 = $langs->transnoentities('Action' . $actiontypecode);
|
||||
|
||||
@ -2200,7 +2201,7 @@ if ($action == 'create')
|
||||
}
|
||||
|
||||
// ReOpen
|
||||
if (($object->statut == 2 || $object->statut == 3) && $user->rights->propal->cloturer) {
|
||||
if (($object->statut == 2 || $object->statut == 3 || $object->statut == 4) && $user->rights->propal->cloturer) {
|
||||
print '<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=reopen' . (empty($conf->global->MAIN_JUMP_TAG) ? '' : '#reopen') . '"';
|
||||
print '>' . $langs->trans('ReOpen') . '</a></div>';
|
||||
}
|
||||
@ -2367,13 +2368,13 @@ if ($action == 'create')
|
||||
$formmail->withcancel = 1;
|
||||
|
||||
// Tableau des substitutions
|
||||
$formmail->substit ['__PROPREF__'] = $object->ref;
|
||||
$formmail->substit ['__SIGNATURE__'] = $user->signature;
|
||||
$formmail->substit ['__REFCLIENT__'] = $object->ref_client;
|
||||
$formmail->substit ['__THIRPARTY_NAME__'] = $object->thirdparty->name;
|
||||
$formmail->substit ['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:'');
|
||||
$formmail->substit ['__PERSONALIZED__'] = '';
|
||||
$formmail->substit ['__CONTACTCIVNAME__'] = '';
|
||||
$formmail->substit['__PROPREF__'] = $object->ref;
|
||||
$formmail->substit['__SIGNATURE__'] = $user->signature;
|
||||
$formmail->substit['__REFCLIENT__'] = $object->ref_client;
|
||||
$formmail->substit['__THIRPARTY_NAME__'] = $object->thirdparty->name;
|
||||
$formmail->substit['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:'');
|
||||
$formmail->substit['__PERSONALIZED__'] = '';
|
||||
$formmail->substit['__CONTACTCIVNAME__'] = '';
|
||||
|
||||
// Find the good contact adress
|
||||
$custcontact = '';
|
||||
@ -2390,15 +2391,15 @@ if ($action == 'create')
|
||||
}
|
||||
|
||||
if (! empty($custcontact)) {
|
||||
$formmail->substit ['__CONTACTCIVNAME__'] = $custcontact;
|
||||
$formmail->substit['__CONTACTCIVNAME__'] = $custcontact;
|
||||
}
|
||||
}
|
||||
|
||||
// Tableau des parametres complementaires
|
||||
$formmail->param ['action'] = 'send';
|
||||
$formmail->param ['models'] = 'propal_send';
|
||||
$formmail->param ['id'] = $object->id;
|
||||
$formmail->param ['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id;
|
||||
$formmail->param['action'] = 'send';
|
||||
$formmail->param['models'] = 'propal_send';
|
||||
$formmail->param['id'] = $object->id;
|
||||
$formmail->param['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id;
|
||||
// Init list of files
|
||||
if (GETPOST("mode") == 'init') {
|
||||
$formmail->clear_attached_files();
|
||||
|
||||
@ -1739,8 +1739,14 @@ class Propal extends CommonObject
|
||||
$resql=$this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$modelpdf=$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED?$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED:$this->modelpdf;
|
||||
$trigger_name='PROPAL_CLOSE_REFUSED';
|
||||
|
||||
if ($statut == 2)
|
||||
{
|
||||
$trigger_name='PROPAL_CLOSE_SIGNED';
|
||||
$modelpdf=$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL?$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL:$this->modelpdf;
|
||||
|
||||
// The connected company is classified as a client
|
||||
$soc=new Societe($this->db);
|
||||
$soc->id = $this->socid;
|
||||
@ -1752,48 +1758,31 @@ class Propal extends CommonObject
|
||||
$this->db->rollback();
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
|
||||
{
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
if (! empty($conf->global->MAIN_MULTILANGS))
|
||||
{
|
||||
$outputlangs = new Translate("",$conf);
|
||||
$newlang=(GETPOST('lang_id') ? GETPOST('lang_id') : $this->client->default_lang);
|
||||
$outputlangs->setDefaultLang($newlang);
|
||||
}
|
||||
//$ret=$object->fetch($id); // Reload to get new records
|
||||
$this->generateDocument($conf->global->PROPALE_ADDON_PDF_ODT_TOBILL?$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL:$this->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
||||
}
|
||||
|
||||
// Call trigger
|
||||
$result=$this->call_trigger('PROPAL_CLOSE_SIGNED',$user);
|
||||
if ($result < 0) { $error++; }
|
||||
// End call triggers
|
||||
}
|
||||
else
|
||||
if ($statut == 4)
|
||||
{
|
||||
|
||||
if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
|
||||
{
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
if (! empty($conf->global->MAIN_MULTILANGS))
|
||||
{
|
||||
$outputlangs = new Translate("",$conf);
|
||||
$newlang=(GETPOST('lang_id') ? GETPOST('lang_id') : $this->client->default_lang);
|
||||
$outputlangs->setDefaultLang($newlang);
|
||||
}
|
||||
//$ret=$object->fetch($id); // Reload to get new records
|
||||
$this->generateDocument($conf->global->PROPALE_ADDON_PDF_ODT_CLOSED?$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED:$this->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
||||
}
|
||||
|
||||
// Call trigger
|
||||
$result=$this->call_trigger('PROPAL_CLOSE_REFUSED',$user);
|
||||
if ($result < 0) { $error++; }
|
||||
// End call triggers
|
||||
$trigger_name='PROPAL_CLASSIFY_BILLED';
|
||||
}
|
||||
|
||||
if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
|
||||
{
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
if (! empty($conf->global->MAIN_MULTILANGS))
|
||||
{
|
||||
$outputlangs = new Translate("",$conf);
|
||||
$newlang=(GETPOST('lang_id') ? GETPOST('lang_id') : $this->client->default_lang);
|
||||
$outputlangs->setDefaultLang($newlang);
|
||||
}
|
||||
//$ret=$object->fetch($id); // Reload to get new records
|
||||
$this->generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
||||
}
|
||||
|
||||
// Call trigger
|
||||
$result=$this->call_trigger($trigger_name,$user);
|
||||
if ($result < 0) { $error++; }
|
||||
// End call triggers
|
||||
|
||||
if ( ! $error )
|
||||
{
|
||||
$this->db->commit();
|
||||
|
||||
@ -1225,11 +1225,12 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G
|
||||
else
|
||||
$subject = $langs->transnoentities('Order') . ' ' . $object->ref;
|
||||
$actiontypecode = 'AC_COM';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto . ".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto;
|
||||
if ($message) {
|
||||
$actionmsg .= $langs->transnoentities('MailTopic') . ": " . $subject . "\n";
|
||||
$actionmsg .= $langs->transnoentities('TextUsedInTheMessageBody') . ":\n";
|
||||
$actionmsg .= $message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
$actionmsg2 = $langs->transnoentities('Action' . $actiontypecode);
|
||||
}
|
||||
@ -1295,18 +1296,10 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G
|
||||
setEventMessage($mesg, 'errors');
|
||||
}
|
||||
}
|
||||
/* }
|
||||
else
|
||||
{
|
||||
$langs->load("other");
|
||||
$mesg='<div class="error">'.$langs->trans('ErrorMailRecipientIsEmpty').' !</div>';
|
||||
$action='presend';
|
||||
dol_syslog('Recipient email is empty');
|
||||
}*/
|
||||
} else {
|
||||
$langs->load("errors");
|
||||
setEventMessage($langs->trans('ErrorCantReadFile', $file), 'errors');
|
||||
dol_syslog('Failed to read file: ' . $file);
|
||||
$langs->load("other");
|
||||
setEventMessage($langs->trans('ErrorMailRecipientIsEmpty') . '!', 'errors');
|
||||
dol_syslog($langs->trans('ErrorMailRecipientIsEmpty'));
|
||||
}
|
||||
} else {
|
||||
$langs->load("other");
|
||||
|
||||
@ -33,6 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT .'/product/class/product.class.php';
|
||||
|
||||
$langs->load('orders');
|
||||
$langs->load('deliveries');
|
||||
@ -325,22 +326,77 @@ if ($resql)
|
||||
$total=0;
|
||||
$subtotal=0;
|
||||
|
||||
$generic_commande = new Commande($db);
|
||||
while ($i < min($num,$limit))
|
||||
{
|
||||
$objp = $db->fetch_object($resql);
|
||||
$var=!$var;
|
||||
print '<tr '.$bc[$var].'>';
|
||||
print '<td class="nowrap">';
|
||||
$generic_commande = new Commande($db);
|
||||
$generic_product = new Product($db);
|
||||
while ($i < min($num,$limit)) {
|
||||
$objp = $db->fetch_object($resql);
|
||||
$var=!$var;
|
||||
print '<tr '.$bc[$var].'>';
|
||||
print '<td class="nowrap">';
|
||||
|
||||
$generic_commande->id=$objp->rowid;
|
||||
$generic_commande->ref=$objp->ref;
|
||||
$generic_commande->id=$objp->rowid;
|
||||
$generic_commande->ref=$objp->ref;
|
||||
$generic_commande->lines=array();
|
||||
$generic_commande->getLinesArray();
|
||||
|
||||
print '<table class="nobordernopadding"><tr class="nocellnopadd">';
|
||||
print '<td class="nobordernopadding nowrap">';
|
||||
print $generic_commande->getNomUrl(1,($viewstatut != 2?0:$objp->fk_statut));
|
||||
print '</td>';
|
||||
print '<table class="nobordernopadding"><tr class="nocellnopadd">';
|
||||
print '<td class="nobordernopadding nowrap">';
|
||||
print $generic_commande->getNomUrl(1,($viewstatut != 2?0:$objp->fk_statut));
|
||||
print '</td>';
|
||||
|
||||
// Shippable Icon
|
||||
if (($objp->fk_statut > 0) && ($objp->fk_statut < 3) && ! empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST)) {
|
||||
$notshippable=0;
|
||||
$text_info='';
|
||||
$nbprod=0;
|
||||
for ($lig=0; $lig<(count($generic_commande->lines)); $lig++) {
|
||||
if ($generic_commande->lines[$lig]->product_type==0) {
|
||||
$nbprod++; // order contains real products
|
||||
$generic_product->id = $generic_commande->lines[$lig]->fk_product;
|
||||
$generic_product->load_stock();
|
||||
// stock order and stock order_supplier
|
||||
$stock_order=0;
|
||||
$stock_order_supplier=0;
|
||||
if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)) {
|
||||
if (! empty($conf->commande->enabled)) {
|
||||
$generic_product->load_stats_commande(0,'1,2');
|
||||
$stock_order=$generic_product->stats_commande['qty'];
|
||||
}
|
||||
if (! empty($conf->fournisseur->enabled)) {
|
||||
$generic_product->load_stats_commande_fournisseur(0,'3');
|
||||
$stock_order_supplier=$generic_product->stats_commande_fournisseur['qty'];
|
||||
}
|
||||
}
|
||||
$text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->ref.' '.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
|
||||
$text_stock_reel = $generic_product->stock_reel.'/'.$stock_order;
|
||||
if ($generic_product->stock_reel<$generic_commande->lines[$lig]->qty) {
|
||||
$notshippable++;
|
||||
$text_info.='<span class="warning">'.$langs->trans('Available').' : '.$text_stock_reel.'</span>';
|
||||
} else {
|
||||
$text_info.='<span class="ok">'.$langs->trans('Available').' : '.$text_stock_reel.'</span>';
|
||||
}
|
||||
if ($stock_order_supplier>0) {
|
||||
$text_info.= ' '.$langs->trans('SupplierOrder').' : '.$stock_order_supplier.'<br>';
|
||||
} else {
|
||||
$text_info.= '<br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($notshippable==0) {
|
||||
$text_icon = img_picto('', 'object_sending');
|
||||
$text_info = $langs->trans('Shippable').'<br>'.$text_info;
|
||||
} else {
|
||||
$text_icon = img_picto('', 'error');
|
||||
$text_info = $langs->trans('NonShippable').'<br>'.$text_info;
|
||||
}
|
||||
if ($nbprod>0) {
|
||||
print '<td>';
|
||||
print $form->textwithtooltip('',$text_info,2,1,$text_icon,'',2);
|
||||
print '</td>';
|
||||
}
|
||||
}
|
||||
|
||||
// warning late icon
|
||||
print '<td style="min-width: 20px" class="nobordernopadding nowrap">';
|
||||
if (($objp->fk_statut > 0) && ($objp->fk_statut < 3) && max($db->jdate($objp->date_commande),$db->jdate($objp->date_livraison)) < ($now - $conf->commande->client->warning_delay))
|
||||
print img_picto($langs->trans("Late"),"warning");
|
||||
|
||||
@ -1615,8 +1615,9 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO
|
||||
$sendtoid = $_POST['receiver'];
|
||||
}
|
||||
}
|
||||
|
||||
if (dol_strlen($sendto)) {
|
||||
|
||||
if (dol_strlen($sendto))
|
||||
{
|
||||
$langs->load("commercial");
|
||||
|
||||
$from = $_POST['fromname'] . ' <' . $_POST['frommail'] . '>';
|
||||
@ -1626,31 +1627,19 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO
|
||||
$sendtobcc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO);
|
||||
$deliveryreceipt = $_POST['deliveryreceipt'];
|
||||
|
||||
if ($action == 'send') {
|
||||
if ($action == 'send' || $action == 'relance')
|
||||
{
|
||||
if (dol_strlen($_POST['subject']))
|
||||
$subject = $_POST['subject'];
|
||||
else
|
||||
$subject = $langs->transnoentities('Bill') . ' ' . $object->ref;
|
||||
$actiontypecode = 'AC_FAC';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto . ".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto;
|
||||
if ($message) {
|
||||
$actionmsg .= $langs->transnoentities('MailTopic') . ": " . $subject . "\n";
|
||||
$actionmsg .= $langs->transnoentities('TextUsedInTheMessageBody') . ":\n";
|
||||
$actionmsg .= $message;
|
||||
}
|
||||
// $actionmsg2=$langs->transnoentities('Action'.$actiontypecode);
|
||||
}
|
||||
if ($action == 'relance') {
|
||||
if (dol_strlen($_POST['subject']))
|
||||
$subject = $_POST['subject'];
|
||||
else
|
||||
$subject = $langs->transnoentities('Relance facture ' . $object->ref);
|
||||
$actiontypecode = 'AC_FAC';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto . ".\n";
|
||||
if ($message) {
|
||||
$actionmsg .= $langs->transnoentities('MailTopic') . ": " . $subject . "\n";
|
||||
$actionmsg .= $langs->transnoentities('TextUsedInTheMessageBody') . ":\n";
|
||||
$actionmsg .= $message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
// $actionmsg2=$langs->transnoentities('Action'.$actiontypecode);
|
||||
}
|
||||
@ -1660,9 +1649,9 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO
|
||||
$formmail = new FormMail($db);
|
||||
|
||||
$attachedfiles = $formmail->get_attached_files();
|
||||
$filepath = $attachedfiles ['paths'];
|
||||
$filename = $attachedfiles ['names'];
|
||||
$mimetype = $attachedfiles ['mimes'];
|
||||
$filepath = $attachedfiles['paths'];
|
||||
$filename = $attachedfiles['names'];
|
||||
$mimetype = $attachedfiles['mimes'];
|
||||
|
||||
// Send mail
|
||||
require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
|
||||
@ -1715,17 +1704,10 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO
|
||||
setEventMessage($mesg, 'errors');
|
||||
}
|
||||
}
|
||||
/* }
|
||||
else
|
||||
{
|
||||
$langs->load("other");
|
||||
$mesgs[]='<div class="error">'.$langs->trans('ErrorMailRecipientIsEmpty').'</div>';
|
||||
dol_syslog('Recipient email is empty');
|
||||
}*/
|
||||
} else {
|
||||
$langs->load("errors");
|
||||
setEventMessage($langs->trans('ErrorCantReadFile', $file), 'errors');
|
||||
dol_syslog('Failed to read file: ' . $file);
|
||||
$langs->load("other");
|
||||
setEventMessage($langs->trans('ErrorMailRecipientIsEmpty') . '!', 'errors');
|
||||
dol_syslog($langs->trans('ErrorMailRecipientIsEmpty'));
|
||||
}
|
||||
} else {
|
||||
$langs->load("other");
|
||||
|
||||
@ -136,12 +136,13 @@ if ($action == 'presend' && GETPOST('sendmail'))
|
||||
$message=make_substitutions($message, $substitutionarray);
|
||||
|
||||
$actiontypecode='AC_FAC';
|
||||
$actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($message)
|
||||
{
|
||||
$actionmsg.=$langs->transnoentities('MailTopic').": ".$subject."\n";
|
||||
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
|
||||
$actionmsg.=$message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
|
||||
// Create form object
|
||||
|
||||
@ -937,7 +937,7 @@ if ($action == 'create')
|
||||
|
||||
// Ref Int
|
||||
print '<tr><td>'.$langs->trans('RefCustomer').'</td>';
|
||||
print '<td colspan="2"><input type="text" siez="5" name="ref_supplier" id="ref_supplier" value="'.GETPOST('ref_supplier','alpha').'"></td></tr>';
|
||||
print '<td colspan="2"><input type="text" size="5" name="ref_supplier" id="ref_supplier" value="'.GETPOST('ref_supplier','alpha').'"></td></tr>';
|
||||
|
||||
// Customer
|
||||
print '<tr>';
|
||||
|
||||
@ -74,7 +74,7 @@ $sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND
|
||||
$sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now - $conf->contrat->services->expires->warning_delay)."')",1,0).') as nb_late,';
|
||||
$sql.= ' SUM('.$db->ifsql("cd.statut=5",1,0).') as nb_closed,';
|
||||
$sql.= " c.rowid as cid, c.ref, c.datec, c.date_contrat, c.statut,";
|
||||
$sql.= " s.nom, s.rowid as socid";
|
||||
$sql.= " s.nom as name, s.rowid as socid";
|
||||
$sql.= " ,c.ref_supplier";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."societe as s";
|
||||
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
|
||||
|
||||
@ -126,13 +126,14 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO
|
||||
if ($action == 'send' || $action == 'relance')
|
||||
{
|
||||
if (dol_strlen($_POST['subject'])) $subject = $_POST['subject'];
|
||||
$actionmsg2=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg2=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($message)
|
||||
{
|
||||
$actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg.=$langs->transnoentities('MailTopic').": ".$subject."\n";
|
||||
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
|
||||
$actionmsg.=$message;
|
||||
$actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -32,9 +32,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/genericobject.class.php';
|
||||
$action=GETPOST('action','alpha');
|
||||
$id=GETPOST('id', 'int');
|
||||
$value=GETPOST('value', 'int');
|
||||
$field=GETPOST('field', 'alpha');
|
||||
$element=GETPOST('element', 'alpha');
|
||||
|
||||
$object = new GenericObject($db);
|
||||
|
||||
/*
|
||||
* View
|
||||
*/
|
||||
@ -44,9 +45,5 @@ top_httphead();
|
||||
print '<!-- Ajax page called with url '.$_SERVER["PHP_SELF"].'?'.$_SERVER["QUERY_STRING"].' -->'."\n";
|
||||
|
||||
// Registering new values
|
||||
if (! empty($action) && ! empty($id) && $user->rights->produit->creer) {
|
||||
if ($action == 'setstatus')
|
||||
$object->setValueFrom('tosell', $value, 'product', $id);
|
||||
else if ($action == 'setstatus_buy')
|
||||
$object->setValueFrom('tobuy', $value, 'product', $id);
|
||||
}
|
||||
if (($action == 'set') && ! empty($id))
|
||||
$object->setValueFrom($field, $value, $element, $id);
|
||||
@ -63,7 +63,7 @@ class box_actions extends ModeleBoxes
|
||||
if ($user->rights->agenda->myactions->read)
|
||||
{
|
||||
$sql = "SELECT a.id, a.label, a.datep as dp, a.percent as percentage,";
|
||||
$sql.= " ta.code,";
|
||||
$sql.= " ta.code, ta.libelle as type_label,";
|
||||
$sql.= " s.nom as name, s.rowid as socid";
|
||||
$sql.= " FROM (".MAIN_DB_PREFIX."c_actioncomm AS ta, ";
|
||||
$sql.= MAIN_DB_PREFIX."actioncomm AS a)";
|
||||
@ -96,7 +96,7 @@ class box_actions extends ModeleBoxes
|
||||
if ($objp->percentage >= 0 && $objp->percentage < 100 && $datelimite < ($now - $delay_warning)) $late=img_warning($langs->trans("Late"));
|
||||
|
||||
//($langs->transnoentities("Action".$objp->code)!=("Action".$objp->code) ? $langs->transnoentities("Action".$objp->code) : $objp->label)
|
||||
$label=$objp->label;
|
||||
$label=empty($objp->label)?$objp->type_label:$objp->label;
|
||||
|
||||
$this->info_box_contents[$i][0] = array('td' => 'align="left" width="16"',
|
||||
'logo' => ("action"),
|
||||
|
||||
@ -118,10 +118,9 @@ abstract class CommonDocGenerator
|
||||
'mycompany_idprof5'=>$mysoc->idprof5,
|
||||
'mycompany_idprof6'=>$mysoc->idprof6,
|
||||
'mycompany_vatnumber'=>$mysoc->tva_intra,
|
||||
// Only private not exists for "mysoc"
|
||||
'mycompany_note'=>$mysoc->note_private
|
||||
//'mycompany_note_private'=>$mysoc->note_private,
|
||||
//'mycompany_note_public'=>$mysoc->note_public,
|
||||
// Only private not exists for "mysoc"
|
||||
'mycompany_note_private'=>$mysoc->note_private,
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
@ -166,6 +165,7 @@ abstract class CommonDocGenerator
|
||||
'company_customeraccountancycode'=>$object->code_compta,
|
||||
'company_supplieraccountancycode'=>$object->code_compta_fournisseur,
|
||||
'company_juridicalstatus'=>$object->forme_juridique,
|
||||
'company_outstanding_limit'=>$object->outstanding_limit,
|
||||
'company_capital'=>$object->capital,
|
||||
'company_idprof1'=>$object->idprof1,
|
||||
'company_idprof2'=>$object->idprof2,
|
||||
|
||||
@ -2074,7 +2074,8 @@ abstract class CommonObject
|
||||
if (! $error)
|
||||
{
|
||||
$trigkey='';
|
||||
if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFYBILLED';
|
||||
if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
|
||||
if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
|
||||
|
||||
if ($trigkey)
|
||||
{
|
||||
@ -2566,6 +2567,11 @@ abstract class CommonObject
|
||||
$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
|
||||
$reshook=$hookmanager->executeHooks('printObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
|
||||
}
|
||||
else
|
||||
{
|
||||
$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
|
||||
$reshook=$hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3012,13 +3018,13 @@ abstract class CommonObject
|
||||
|
||||
print '<table class="nobordernopadding margintable" width="100%">';
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td width="30%">'.$langs->trans('Margins').'</td>';
|
||||
print '<td width="20%" align="right">'.$langs->trans('SellingPrice').'</td>';
|
||||
print '<td width="15%">'.$langs->trans('Margins').'</td>';
|
||||
print '<td width="15%" align="right">'.$langs->trans('SellingPrice').'</td>';
|
||||
if ($conf->global->MARGIN_TYPE == "1")
|
||||
print '<td width="20%" align="right">'.$langs->trans('BuyingPrice').'</td>';
|
||||
print '<td width="15%" align="right">'.$langs->trans('BuyingPrice').'</td>';
|
||||
else
|
||||
print '<td width="20%" align="right">'.$langs->trans('CostPrice').'</td>';
|
||||
print '<td width="20%" align="right">'.$langs->trans('Margin').'</td>';
|
||||
print '<td width="15%" align="right">'.$langs->trans('CostPrice').'</td>';
|
||||
print '<td width="15%" align="right">'.$langs->trans('Margin').'</td>';
|
||||
if (! empty($conf->global->DISPLAY_MARGIN_RATES))
|
||||
print '<td align="right">'.$langs->trans('MarginRate').'</td>';
|
||||
if (! empty($conf->global->DISPLAY_MARK_RATES))
|
||||
|
||||
@ -111,7 +111,7 @@ class Events // extends CommonObject
|
||||
$this->description=trim($this->description);
|
||||
|
||||
// Check parameters
|
||||
if (! $this->description) { $this->error='ErrorBadValueForParameter'; return -1; }
|
||||
if (empty($this->description)) { $this->error='ErrorBadValueForParameter'; return -1; }
|
||||
|
||||
// Insert request
|
||||
$sql = "INSERT INTO ".MAIN_DB_PREFIX."events(";
|
||||
@ -129,7 +129,7 @@ class Events // extends CommonObject
|
||||
$sql.= " ".($_SERVER['HTTP_USER_AGENT']?"'".dol_trunc($_SERVER['HTTP_USER_AGENT'],250)."'":'NULL').",";
|
||||
$sql.= " '".$this->db->idate($this->dateevent)."',";
|
||||
$sql.= " ".($user->id?"'".$user->id."'":'NULL').",";
|
||||
$sql.= " '".$this->db->escape($this->description)."'";
|
||||
$sql.= " '".$this->db->escape(dol_trunc($this->description,250))."'";
|
||||
$sql.= ")";
|
||||
|
||||
dol_syslog(get_class($this)."::create", LOG_DEBUG);
|
||||
|
||||
@ -4032,9 +4032,10 @@ class Form
|
||||
* @param int $translate Translate and encode value
|
||||
* @param int $maxlen Length maximum for labels
|
||||
* @param int $disabled Html select box is disabled
|
||||
* @param int $sort 'ASC' or 'DESC' =Sort on label, '' or 'NONE'=Do not sort
|
||||
* @param int $sort 'ASC' or 'DESC' = Sort on label, '' or 'NONE' = Do not sort
|
||||
* @param string $morecss Add more class to css styles
|
||||
* @return string HTML select string.
|
||||
* @see multiselectarray
|
||||
*/
|
||||
static function selectarray($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $moreparam='', $translate=0, $maxlen=0, $disabled=0, $sort='', $morecss='')
|
||||
{
|
||||
@ -4092,54 +4093,65 @@ class Form
|
||||
*
|
||||
* @param string $htmlname Name of select
|
||||
* @param array $array Array with key+value
|
||||
* @param array $selected Preselected keys
|
||||
* @param array $selected Array with key+value preselected
|
||||
* @param int $key_in_label 1 pour afficher la key dans la valeur "[key] value"
|
||||
* @param int $value_as_key 1 to use value as key
|
||||
* @param string $option Valeur de l'option en fonction du type choisi
|
||||
* @param int $translate Translate and encode value
|
||||
* @param int $width Force width of select box. May be used only when using jquery couch.
|
||||
* @return string HTML multiselect string
|
||||
* @see selectarray
|
||||
*/
|
||||
function multiselectarray($htmlname, $array, $selected=array(), $key_in_label=0, $value_as_key=0, $option='', $translate=0)
|
||||
static function multiselectarray($htmlname, $array, $selected=array(), $key_in_label=0, $value_as_key=0, $option='', $translate=0, $width=0)
|
||||
{
|
||||
global $conf, $langs;
|
||||
|
||||
$out = '<select id="'.$htmlname.'" class="multiselect" multiple="multiple" name="'.$htmlname.'[]"'.$option.'>'."\n";
|
||||
// Add code for jquery to use multiselect
|
||||
// Note: Plugin "multiselect" is no more provided by Dolibarr. You must include it and load it into your module to use it.
|
||||
if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && ($conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiselect'))
|
||||
|| (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT')))
|
||||
{
|
||||
print '<!-- JS CODE FOR multiselect -->
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
$.extend($.ui.multiselect.locale, {
|
||||
addAll:\''.$langs->transnoentities("AddAll").'\',
|
||||
removeAll:\''.$langs->transnoentities("RemoveAll").'\',
|
||||
itemsCount:\''.$langs->transnoentities("ItemsCount").'\'
|
||||
});
|
||||
$(function(){
|
||||
$("#'.$htmlname.'").multiselect({
|
||||
searchable: false,
|
||||
width: '.($width?$width:300).',
|
||||
height: 120
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>';
|
||||
}
|
||||
|
||||
// Add code for jquery to use multiple-select
|
||||
// Note: Plugin "multiselect" is no more provided by Dolibarr. You must include it and load it into your module to use it.
|
||||
if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && ($conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiple-select'))
|
||||
|| (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT')))
|
||||
{
|
||||
print '<!-- JS CODE FOR multiple-select -->
|
||||
<script src="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiple-select/jquery.multiple.select.js"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
$(\'#'.$htmlname.'\').multipleSelect();
|
||||
});
|
||||
</script>';
|
||||
}
|
||||
|
||||
// Try also magic suggest
|
||||
|
||||
$out = '<select id="'.$htmlname.'" class="multiselect" multiple="multiple" name="'.$htmlname.'[]"'.$option.($width?' style="width: '.$width.'px"':'').'>'."\n";
|
||||
if (is_array($array) && ! empty($array))
|
||||
{
|
||||
if ($value_as_key) $array=array_combine($array, $array);
|
||||
|
||||
if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && is_array($selected) && ! empty($selected))
|
||||
{
|
||||
foreach ($selected as $selected_value)
|
||||
{
|
||||
foreach($array as $key => $value)
|
||||
{
|
||||
if ($selected_value == $key)
|
||||
{
|
||||
$value=$array[$selected_value];
|
||||
$out.= '<option value="'.$key.'" selected="selected">';
|
||||
$newval = ($translate ? $langs->trans(ucfirst($value)) : $value);
|
||||
$newval = ($key_in_label ? $key.' - '.$newval : $newval);
|
||||
$out.= dol_htmlentitiesbr($newval);
|
||||
$out.= '</option>'."\n";
|
||||
unset($array[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($array))
|
||||
{
|
||||
foreach ($array as $key => $value)
|
||||
{
|
||||
$out.= '<option value="'.$key.'">';
|
||||
$newval = ($translate ? $langs->trans(ucfirst($value)) : $value);
|
||||
$newval = ($key_in_label ? $key.' - '.$newval : $newval);
|
||||
$out.= dol_htmlentitiesbr($newval);
|
||||
$out.= '</option>'."\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (! empty($array))
|
||||
{
|
||||
foreach ($array as $key => $value)
|
||||
{
|
||||
@ -4150,7 +4162,7 @@ class Form
|
||||
}
|
||||
$out.= '>';
|
||||
|
||||
$newval = ($translate ? $langs->trans(ucfirst($value)) : $value);
|
||||
$newval = ($translate ? $langs->trans($value) : $value);
|
||||
$newval = ($key_in_label ? $key.' - '.$newval : $newval);
|
||||
$out.= dol_htmlentitiesbr($newval);
|
||||
$out.= '</option>'."\n";
|
||||
@ -4166,18 +4178,18 @@ class Form
|
||||
/**
|
||||
* Return an html string with a select combo box to choose yes or no
|
||||
*
|
||||
* @param string $htmlname Name of html select field
|
||||
* @param string $value Pre-selected value
|
||||
* @param int $option 0 return yes/no, 1 return 1/0
|
||||
* @param bool $disabled true or false
|
||||
* @return mixed See option
|
||||
* @param string $htmlname Name of html select field
|
||||
* @param string $value Pre-selected value
|
||||
* @param int $option 0 return yes/no, 1 return 1/0
|
||||
* @param bool $disabled true or false
|
||||
* @param useempty $useempty 1=Add empty line
|
||||
* @return mixed See option
|
||||
*/
|
||||
function selectyesno($htmlname,$value='',$option=0,$disabled=false)
|
||||
function selectyesno($htmlname,$value='',$option=0,$disabled=false,$useempty='')
|
||||
{
|
||||
global $langs;
|
||||
|
||||
$yes="yes"; $no="no";
|
||||
|
||||
if ($option)
|
||||
{
|
||||
$yes="1";
|
||||
@ -4187,15 +4199,17 @@ class Form
|
||||
$disabled = ($disabled ? ' disabled="disabled"' : '');
|
||||
|
||||
$resultyesno = '<select class="flat" id="'.$htmlname.'" name="'.$htmlname.'"'.$disabled.'>'."\n";
|
||||
if ($useempty) $resultyesno .= '<option value="-1"'.(($value < 0)?' selected="selected"':'').'></option>'."\n";
|
||||
if (("$value" == 'yes') || ($value == 1))
|
||||
{
|
||||
$resultyesno .= '<option value="'.$yes.'" selected="selected">'.$langs->trans("Yes").'</option>'."\n";
|
||||
$resultyesno .= '<option value="'.$no.'">'.$langs->trans("No").'</option>'."\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
$selected=($useempty?'':' selected="selected"');
|
||||
$resultyesno .= '<option value="'.$yes.'">'.$langs->trans("Yes").'</option>'."\n";
|
||||
$resultyesno .= '<option value="'.$no.'" selected="selected">'.$langs->trans("No").'</option>'."\n";
|
||||
$resultyesno .= '<option value="'.$no.'"'.$selected.'>'.$langs->trans("No").'</option>'."\n";
|
||||
}
|
||||
$resultyesno .= '</select>'."\n";
|
||||
return $resultyesno;
|
||||
|
||||
@ -31,7 +31,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php';
|
||||
*/
|
||||
class Interfaces
|
||||
{
|
||||
var $dir; // Directory with all core and external triggers files
|
||||
var $db;
|
||||
var $dir; // Directory with all core and external triggers files
|
||||
var $errors = array(); // Array for errors
|
||||
|
||||
/**
|
||||
|
||||
@ -206,7 +206,7 @@ function show_array_actions_to_do($max=5)
|
||||
include_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php';
|
||||
|
||||
$sql = "SELECT a.id, a.label, a.datep as dp, a.datep2 as dp2, a.fk_user_author, a.percent,";
|
||||
$sql.= " c.code, c.libelle,";
|
||||
$sql.= " c.code, c.libelle as type_label,";
|
||||
$sql.= " s.nom as sname, s.rowid, s.client";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."c_actioncomm as c LEFT JOIN ";
|
||||
$sql.= " ".MAIN_DB_PREFIX."actioncomm as a ON c.id = a.fk_action";
|
||||
@ -243,7 +243,7 @@ function show_array_actions_to_do($max=5)
|
||||
print '<tr '.$bc[$var].'>';
|
||||
|
||||
$staticaction->type_code=$obj->code;
|
||||
$staticaction->libelle=$obj->label;
|
||||
$staticaction->label=($obj->label?$obj->label:$obj->type_label);
|
||||
$staticaction->id=$obj->id;
|
||||
print '<td>'.$staticaction->getNomUrl(1,34).'</td>';
|
||||
|
||||
@ -440,14 +440,6 @@ function actions_prepare_head($object)
|
||||
$head[$h][2] = 'card';
|
||||
$h++;
|
||||
|
||||
if (! empty($conf->global->AGENDA_USE_SEVERAL_CONTACTS))
|
||||
{
|
||||
$head[$h][0] = DOL_URL_ROOT.'/comm/action/contact.php?id='.$object->id;
|
||||
$head[$h][1] = $langs->trans("Contacts");
|
||||
$head[$h][2] = 'contact';
|
||||
$h++;
|
||||
}
|
||||
|
||||
// Attached files
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
$upload_dir = $conf->agenda->dir_output . "/" . $object->id;
|
||||
|
||||
@ -460,35 +460,36 @@ function ajax_constantonoff($code, $input=array(), $entity=null, $revertonoff=0,
|
||||
}
|
||||
|
||||
/**
|
||||
* On/off button for product tosell or tobuy
|
||||
* On/off button for object
|
||||
*
|
||||
* @param int $id Id product to set
|
||||
* @param string $code Name of constant : status or status_buy
|
||||
* @param int $object Id product to set
|
||||
* @param string $code Name of constant : status or status_buy for product by example
|
||||
* @param string $field Name of database field : tosell or tobuy for product by example
|
||||
* @param string $text_on Text if on
|
||||
* @param string $text_off Text if off
|
||||
* @param array $input Array of type->list of CSS element to switch. Example: array('disabled'=>array(0=>'cssid'))
|
||||
* @return void
|
||||
*/
|
||||
function ajax_productonoff($id, $code, $input=array())
|
||||
function ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array())
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
||||
global $conf, $langs, $db;
|
||||
|
||||
$object = new Product($db);
|
||||
$object->fetch($id);
|
||||
global $langs;
|
||||
|
||||
$out= '<script type="text/javascript">
|
||||
$(function() {
|
||||
var input = '.json_encode($input).';
|
||||
|
||||
// Set constant
|
||||
$("#set_'.$code.'").click(function() {
|
||||
$.get( "'.DOL_URL_ROOT.'/core/ajax/productonoff.php", {
|
||||
action: \'set'.$code.'\',
|
||||
$("#set_'.$code.'_'.$object->id.'").click(function() {
|
||||
$.get( "'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
|
||||
action: \'set\',
|
||||
field: \''.$field.'\',
|
||||
value: \'1\',
|
||||
id: \''.$id.'\'
|
||||
element: \''.$object->element.'\',
|
||||
id: \''.$object->id.'\'
|
||||
},
|
||||
function() {
|
||||
$("#set_'.$code.'").hide();
|
||||
$("#del_'.$code.'").show();
|
||||
$("#set_'.$code.'_'.$object->id.'").hide();
|
||||
$("#del_'.$code.'_'.$object->id.'").show();
|
||||
// Enable another element
|
||||
if (input.disabled && input.disabled.length > 0) {
|
||||
$.each(input.disabled, function(key,value) {
|
||||
@ -508,15 +509,17 @@ function ajax_productonoff($id, $code, $input=array())
|
||||
});
|
||||
|
||||
// Del constant
|
||||
$("#del_'.$code.'").click(function() {
|
||||
$.get( "'.DOL_URL_ROOT.'/core/ajax/productonoff.php", {
|
||||
action: \'set'.$code.'\',
|
||||
$("#del_'.$code.'_'.$object->id.'").click(function() {
|
||||
$.get( "'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
|
||||
action: \'set\',
|
||||
field: \''.$field.'\',
|
||||
value: \'0\',
|
||||
id: \''.$id.'\'
|
||||
element: \''.$object->element.'\',
|
||||
id: \''.$object->id.'\'
|
||||
},
|
||||
function() {
|
||||
$("#del_'.$code.'").hide();
|
||||
$("#set_'.$code.'").show();
|
||||
$("#del_'.$code.'_'.$object->id.'").hide();
|
||||
$("#set_'.$code.'_'.$object->id.'").show();
|
||||
// Disable another element
|
||||
if (input.disabled && input.disabled.length > 0) {
|
||||
$.each(input.disabled, function(key,value) {
|
||||
@ -536,14 +539,9 @@ function ajax_productonoff($id, $code, $input=array())
|
||||
});
|
||||
});
|
||||
</script>';
|
||||
if ($code=='status') {
|
||||
$out.= '<span id="set_'.$code.'" class="linkobject '.($object->$code==1?'hideobject':'').'">'.img_picto($langs->trans("ProductStatusNotOnSell"),'switch_off').'</span>';
|
||||
$out.= '<span id="del_'.$code.'" class="linkobject '.($object->$code==1?'':'hideobject').'">'.img_picto($langs->trans("ProductStatusOnSell"),'switch_on').'</span>';
|
||||
}
|
||||
if ($code=='status_buy') {
|
||||
$out.= '<span id="set_'.$code.'" class="linkobject '.($object->$code==1?'hideobject':'').'">'.img_picto($langs->trans("ProductStatusNotOnBuy"),'switch_off').'</span>';
|
||||
$out.= '<span id="del_'.$code.'" class="linkobject '.($object->$code==1?'':'hideobject').'">'.img_picto($langs->trans("ProductStatusOnBuy"),'switch_on').'</span>';
|
||||
}
|
||||
$out.= '<span id="set_'.$code.'_'.$object->id.'" class="linkobject '.($object->$code==1?'hideobject':'').'">'.img_picto($langs->trans($text_off),'switch_off').'</span>';
|
||||
$out.= '<span id="del_'.$code.'_'.$object->id.'" class="linkobject '.($object->$code==1?'':'hideobject').'">'.img_picto($langs->trans($text_on),'switch_on').'</span>';
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
@ -566,9 +566,10 @@ function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR')
|
||||
$nbFerie = 0;
|
||||
|
||||
// Check to ensure we use correct parameters
|
||||
if ((($timestampEnd - $timestampStart) % 86400) != 0) return 'ErrorDates must use same hour and be GMT dates';
|
||||
if ((($timestampEnd - $timestampStart) % 86400) != 0) return 'ErrorDates must use same hours and must be GMT dates';
|
||||
|
||||
while ($timestampStart < $timestampEnd) // Loop end when equals
|
||||
$i=0;
|
||||
while ($timestampStart < $timestampEnd && ($i < 50000)) // Loop end when equals (Test on i is a security loop to avoid infinite loop)
|
||||
{
|
||||
$ferie=false;
|
||||
$countryfound=0;
|
||||
@ -576,7 +577,6 @@ function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR')
|
||||
$jour = date("d", $timestampStart);
|
||||
$mois = date("m", $timestampStart);
|
||||
$annee = date("Y", $timestampStart);
|
||||
|
||||
if ($countrycode == 'FR')
|
||||
{
|
||||
$countryfound=1;
|
||||
@ -722,8 +722,10 @@ function num_public_holiday($timestampStart, $timestampEnd, $countrycode='FR')
|
||||
if ($ferie) $nbFerie++;
|
||||
|
||||
// Increase number of days (on go up into loop)
|
||||
$jour++;
|
||||
$timestampStart=dol_mktime(0,0,0,$mois,$jour,$annee,1); // Generate GMT date for next day
|
||||
$timestampStart=dol_time_plus_duree($timestampStart, 1, 'd');
|
||||
//var_dump($jour.' '.$mois.' '.$annee.' '.$timestampStart);
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
return $nbFerie;
|
||||
@ -764,13 +766,16 @@ function num_between_day($timestampStart, $timestampEnd, $lastday=0)
|
||||
* @param int $inhour 0: return number of days, 1: return number of hours
|
||||
* @param int $lastday We include last day, 0: no, 1:yes
|
||||
* @param int $halfday Tag to define half day when holiday start and end
|
||||
* @param string $countrycode Country code (company country code if not defined)
|
||||
* @return int Number of days or hours
|
||||
*/
|
||||
function num_open_day($timestampStart, $timestampEnd, $inhour=0, $lastday=0, $halfday=0)
|
||||
function num_open_day($timestampStart, $timestampEnd, $inhour=0, $lastday=0, $halfday=0, $country_code='')
|
||||
{
|
||||
global $langs;
|
||||
global $langs,$mysoc;
|
||||
|
||||
dol_syslog('num_open_day timestampStart='.$timestampStart.' timestampEnd='.$timestampEnd.' bit='.$lastday);
|
||||
if (empty($country_code)) $country_code=$mysoc->country_code;
|
||||
|
||||
dol_syslog('num_open_day timestampStart='.$timestampStart.' timestampEnd='.$timestampEnd.' bit='.$lastday.' country_code='.$country_code);
|
||||
|
||||
// Check parameters
|
||||
if (! is_int($timestampStart) && ! is_float($timestampStart)) return 'ErrorBadParameter_num_open_day';
|
||||
@ -779,7 +784,9 @@ function num_open_day($timestampStart, $timestampEnd, $inhour=0, $lastday=0, $ha
|
||||
//print 'num_open_day timestampStart='.$timestampStart.' timestampEnd='.$timestampEnd.' bit='.$lastday;
|
||||
if ($timestampStart < $timestampEnd)
|
||||
{
|
||||
$nbOpenDay = num_between_day($timestampStart, $timestampEnd, $lastday) - num_public_holiday($timestampStart, $timestampEnd, $lastday);
|
||||
$numdays = num_between_day($timestampStart, $timestampEnd, $lastday);
|
||||
$numholidays = num_public_holiday($timestampStart, $timestampEnd, $country_code);
|
||||
$nbOpenDay = $numdays - $numholidays;
|
||||
$nbOpenDay.= " " . $langs->trans("Days");
|
||||
if ($inhour == 1 && $nbOpenDay <= 3) $nbOpenDay = $nbOpenDay*24 . $langs->trans("HourShort");
|
||||
return $nbOpenDay - (($inhour == 1 ? 12 : 0.5) * abs($halfday));
|
||||
|
||||
@ -2862,7 +2862,11 @@ function price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerou
|
||||
|
||||
$listofcurrenciesbefore=array('USD');
|
||||
if (in_array($currency_code,$listofcurrenciesbefore)) $cursymbolbefore.=$outlangs->getCurrencySymbol($currency_code);
|
||||
else $cursymbolafter.=$outlangs->getCurrencySymbol($currency_code);
|
||||
else
|
||||
{
|
||||
$tmpcur=$outlangs->getCurrencySymbol($currency_code);
|
||||
$cursymbolafter.=($tmpcur == $currency_code ? ' '.$tmpcur : $tmpcur);
|
||||
}
|
||||
}
|
||||
$output=$cursymbolbefore.$output.$end.$cursymbolafter;
|
||||
|
||||
|
||||
@ -41,12 +41,13 @@ require_once(DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php');
|
||||
* @param date $paymentdatebefore Payment before date (must includes hour)
|
||||
* @param int $usestdout Add information onto standard output
|
||||
* @param int $regenerate ''=Use existing PDF files, 'nameofpdf'=Regenerate all PDF files using the template
|
||||
* @param string $option Suffix to add into file name of generated PDF
|
||||
* @param string $filesuffix Suffix to add into file name of generated PDF
|
||||
* @param string $paymentbankid Only if payment on this bank account id
|
||||
* @param array $thirdpartiesid List of thirdparties id when using filter excludethirdpartiesid or onlythirdpartiesid
|
||||
* @param string $fileprefix Prefix to add into filename of generated PDF
|
||||
* @return int Error code
|
||||
*/
|
||||
function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, $usestdout, $regenerate=0, $option='', $paymentbankid='', $thirdpartiesid='')
|
||||
function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, $usestdout, $regenerate=0, $filesuffix='', $paymentbankid='', $thirdpartiesid='', $fileprefix='mergedpdf')
|
||||
{
|
||||
$sql = "SELECT DISTINCT f.rowid, f.facnumber";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."facture as f";
|
||||
@ -220,13 +221,6 @@ function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filte
|
||||
if ($conf->global->MAIN_DISABLE_PDF_COMPRESSION) $pdf->SetCompression(false);
|
||||
//$pdf->SetCompression(false);
|
||||
|
||||
|
||||
//$pdf->Open();
|
||||
//$pdf->AddPage();
|
||||
//$title=$langs->trans("BillsCustomersUnpaid");
|
||||
//if ($option=='late') $title=$langs->trans("BillsCustomersUnpaid");
|
||||
//$pdf->MultiCell(100, 3, $title, 0, 'J');
|
||||
|
||||
// Add all others
|
||||
foreach($files as $file)
|
||||
{
|
||||
@ -248,9 +242,9 @@ function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filte
|
||||
dol_mkdir($diroutputpdf);
|
||||
|
||||
// Save merged file
|
||||
$filename='mergedpdf';
|
||||
|
||||
if (! empty($option)) $filename.='_'.$option;
|
||||
$filename=$fileprefix;
|
||||
if (empty($filename)) $filename='mergedpdf';
|
||||
if (! empty($filesuffix)) $filename.='_'.$filesuffix;
|
||||
$file=$diroutputpdf.'/'.$filename.'.pdf';
|
||||
|
||||
if (! $error && $pagecount)
|
||||
|
||||
121
htdocs/core/modules/modSyncSupplierWebServices.class.php
Executable file
121
htdocs/core/modules/modSyncSupplierWebServices.class.php
Executable file
@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/* Copyright (C) 2014 Ion Agorria <ion@agorria.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \defgroup webservices Module webservices
|
||||
* \brief Module to enable client for supplier WebServices
|
||||
* \file htdocs/core/modules/modSyncSupplierWebServices.class.php
|
||||
* \ingroup webservices
|
||||
* \brief File to describe client for supplier webservices module
|
||||
*/
|
||||
include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php';
|
||||
|
||||
/**
|
||||
* Class to describe a WebServices module
|
||||
*/
|
||||
class modSyncSupplierWebServices extends DolibarrModules
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor. Define names, constants, directories, boxes, permissions
|
||||
*
|
||||
* @param DoliDB $db Database handler
|
||||
*/
|
||||
function __construct($db)
|
||||
{
|
||||
$this->db = $db;
|
||||
$this->numero = 2650;
|
||||
|
||||
$this->family = "technic";
|
||||
// Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module)
|
||||
$this->name = preg_replace('/^mod/i','',get_class($this));
|
||||
$this->description = "Enable the client for external supplier web services";
|
||||
$this->version = 'experimental'; // 'experimental' or 'dolibarr' or version
|
||||
// Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase)
|
||||
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
|
||||
// Where to store the module in setup page (0=common,1=interface,2=others,3=very specific)
|
||||
$this->special = 1;
|
||||
// Name of image file used for this module.
|
||||
$this->picto='technic';
|
||||
|
||||
// Data directories to create when module is enabled
|
||||
$this->dirs = array();
|
||||
|
||||
// Config pages
|
||||
//-------------
|
||||
//$this->config_page_url = array("webservices.php@webservices");
|
||||
|
||||
// Dependancies
|
||||
//-------------
|
||||
$this->depends = array();
|
||||
$this->requiredby = array();
|
||||
$this->langfiles = array("other");
|
||||
|
||||
// Constantes
|
||||
//-----------
|
||||
$this->const = array();
|
||||
|
||||
// New pages on tabs
|
||||
// -----------------
|
||||
$this->tabs = array();
|
||||
|
||||
// Boxes
|
||||
//------
|
||||
$this->boxes = array();
|
||||
|
||||
// Permissions
|
||||
//------------
|
||||
$this->rights = array();
|
||||
$this->rights_class = 'syncsupplierwebservices';
|
||||
$r=0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function called when module is enabled.
|
||||
* The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database.
|
||||
* It also creates data directories
|
||||
*
|
||||
* @param string $options Options when enabling module ('', 'noboxes')
|
||||
* @return int 1 if OK, 0 if KO
|
||||
*/
|
||||
function init($options='')
|
||||
{
|
||||
// Prevent pb of modules not correctly disabled
|
||||
//$this->remove($options);
|
||||
|
||||
$sql = array();
|
||||
|
||||
return $this->_init($sql,$options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Function called when module is disabled.
|
||||
* Remove from database constants, boxes and permissions from Dolibarr database.
|
||||
* Data directories are not deleted
|
||||
*
|
||||
* @param string $options Options when enabling module ('', 'noboxes')
|
||||
* @return int 1 if OK, 0 if KO
|
||||
*/
|
||||
function remove($options='')
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
return $this->_remove($sql,$options);
|
||||
}
|
||||
|
||||
}
|
||||
@ -48,7 +48,7 @@ if (empty($reshook) && ! empty($extrafields->attribute_label))
|
||||
print '<table width="100%" class="nobordernopadding"><tr><td';
|
||||
if (! empty($extrafields->attribute_required [$key])) print ' class="fieldrequired"';
|
||||
print '>' . $label . '</td>';
|
||||
if (($object->statut == 0 || $extrafields->attribute_alwayseditable[$key]) && $user->rights->propal->creer && ($action != 'edit_extras' || GETPOST('attribute') != $key))
|
||||
if (($object->statut == 0 || $extrafields->attribute_alwayseditable[$key]) && $user->rights->{$object->element}->creer && ($action != 'edit_extras' || GETPOST('attribute') != $key))
|
||||
print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=edit_extras&attribute=' . $key . '">' . img_edit().'</a></td>';
|
||||
|
||||
print '</tr></table>';
|
||||
@ -59,9 +59,9 @@ if (empty($reshook) && ! empty($extrafields->attribute_label))
|
||||
$value = isset($_POST ["options_" . $key]) ? dol_mktime($_POST ["options_" . $key . "hour"], $_POST ["options_" . $key . "min"], 0, $_POST ["options_" . $key . "month"], $_POST ["options_" . $key . "day"], $_POST ["options_" . $key . "year"]) : $db->jdate($object->array_options ['options_' . $key]);
|
||||
}
|
||||
|
||||
if ($action == 'edit_extras' && $user->rights->propal->creer && GETPOST('attribute') == $key)
|
||||
if ($action == 'edit_extras' && $user->rights->{$object->element}->creer && GETPOST('attribute') == $key)
|
||||
{
|
||||
print '<form enctype="multipart/form-data" action="' . $_SERVER["PHP_SELF"] . '" method="post" name="formsoc">';
|
||||
print '<form enctype="multipart/form-data" action="' . $_SERVER["PHP_SELF"] . '" method="post" name="formextra">';
|
||||
print '<input type="hidden" name="action" value="update_extras">';
|
||||
print '<input type="hidden" name="attribute" value="' . $key . '">';
|
||||
print '<input type="hidden" name="token" value="' . $_SESSION ['newtoken'] . '">';
|
||||
|
||||
@ -160,7 +160,7 @@ else {
|
||||
'option_disabled' => 'addPredefinedProductButton', // html id to disable once select is done
|
||||
'warning' => $langs->trans("NoPriceDefinedForThisSupplier") // translation of an error saved into var 'error'
|
||||
);
|
||||
$form->select_produits_fournisseurs($object->fourn_id, GETPOST('idprodfournprice'), 'idprodfournprice', '', '', $ajaxoptions, 1);
|
||||
$form->select_produits_fournisseurs($object->socid, GETPOST('idprodfournprice'), 'idprodfournprice', '', '', $ajaxoptions, 1);
|
||||
}
|
||||
echo '</span>';
|
||||
}
|
||||
|
||||
@ -83,7 +83,8 @@ abstract class DolibarrTriggers
|
||||
|
||||
$this->db = $db;
|
||||
|
||||
if (!isset($this->name)) {
|
||||
if (empty($this->name))
|
||||
{
|
||||
$this->name = preg_replace('/^Interface/i', '', get_class($this));
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,7 +66,9 @@ class InterfaceLogevents extends DolibarrTriggers
|
||||
|
||||
// Initialisation donnees (date,duree,texte,desc)
|
||||
$text="(UserLogged,".$object->login.")";
|
||||
$text.=(empty($object->trigger_mesg)?'':' - '.$object->trigger_mesg);
|
||||
$desc="(UserLogged,".$object->login.")";
|
||||
$desc.=(empty($object->trigger_mesg)?'':' - '.$object->trigger_mesg);
|
||||
}
|
||||
if ($action == 'USER_LOGIN_FAILED')
|
||||
{
|
||||
|
||||
@ -145,6 +145,17 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
$object->actiontypecode='AC_OTH_AUTO';
|
||||
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("PropalClosedSignedInDolibarr",$object->ref);
|
||||
$object->actionmsg=$langs->transnoentities("PropalClosedSignedInDolibarr",$object->ref);
|
||||
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
|
||||
|
||||
$object->sendtoid=0;
|
||||
}
|
||||
elseif ($action == 'PROPAL_CLASSIFY_BILLED')
|
||||
{
|
||||
$langs->load("propal");
|
||||
|
||||
$object->actiontypecode='AC_OTH_AUTO';
|
||||
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("PropalClassifiedBilledInDolibarr",$object->ref);
|
||||
$object->actionmsg=$langs->transnoentities("PropalClassifiedBilledInDolibarr",$object->ref);
|
||||
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
|
||||
|
||||
$object->sendtoid=0;
|
||||
@ -253,7 +264,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
}
|
||||
elseif ($action == 'FICHINTER_CREATE')
|
||||
{
|
||||
$langs->load("other");
|
||||
$langs->load("other");
|
||||
$langs->load("interventions");
|
||||
|
||||
$object->actiontypecode='AC_OTH_AUTO';
|
||||
@ -281,7 +292,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
}
|
||||
elseif ($action == 'FICHINTER_MODIFY')
|
||||
{
|
||||
$langs->load("other");
|
||||
$langs->load("other");
|
||||
$langs->load("interventions");
|
||||
|
||||
$object->actiontypecode='AC_OTH_AUTO';
|
||||
@ -293,7 +304,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
$object->fk_element=0;
|
||||
$object->elementtype='';
|
||||
}
|
||||
elseif ($action == 'FICHINTER_SENTBYMAIL')
|
||||
elseif ($action == 'FICHINTER_SENTBYMAIL')
|
||||
{
|
||||
$langs->load("other");
|
||||
$langs->load("interventions");
|
||||
@ -305,19 +316,31 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
// Parameters $object->sendtoid defined by caller
|
||||
//$object->sendtoid=0;
|
||||
}
|
||||
elseif ($action == 'FICHINTER_CLASSIFYBILLED')
|
||||
elseif ($action == 'FICHINTER_CLASSIFY_BILLED')
|
||||
{
|
||||
$langs->load("other");
|
||||
$langs->load("interventions");
|
||||
|
||||
$object->actiontypecode='AC_OTH_AUTO';
|
||||
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionClassifiedBilled",$object->ref);
|
||||
$object->actionmsg=$langs->transnoentities("InterventionClassifiedBilled",$object->ref);
|
||||
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionClassifiedBilledInDolibarr",$object->ref);
|
||||
$object->actionmsg=$langs->transnoentities("InterventionClassifiedBilledInDolibarr",$object->ref);
|
||||
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
|
||||
|
||||
$object->sendtoid=0;
|
||||
}
|
||||
elseif ($action == 'FICHINTER_DELETE')
|
||||
elseif ($action == 'FICHINTER_CLASSIFY_UNBILLED')
|
||||
{
|
||||
$langs->load("other");
|
||||
$langs->load("interventions");
|
||||
|
||||
$object->actiontypecode='AC_OTH_AUTO';
|
||||
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionClassifiedUnbilledInDolibarr",$object->ref);
|
||||
$object->actionmsg=$langs->transnoentities("InterventionClassifiedUnbilledInDolibarr",$object->ref);
|
||||
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
|
||||
|
||||
$object->sendtoid=0;
|
||||
}
|
||||
elseif ($action == 'FICHINTER_DELETE')
|
||||
{
|
||||
$langs->load("other");
|
||||
$langs->load("interventions");
|
||||
|
||||
@ -462,12 +462,13 @@ if ($action == 'send' && ! GETPOST('addfile','alpha') && ! GETPOST('removedfile'
|
||||
if (dol_strlen(GETPOST('subject','alpha'))) $subject=GETPOST('subject','alpha');
|
||||
else $subject = $langs->transnoentities('Shipping').' '.$object->ref;
|
||||
$actiontypecode='AC_SHIP';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($message)
|
||||
{
|
||||
$actionmsg.=$langs->transnoentities('MailTopic').": ".$subject."\n";
|
||||
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
|
||||
$actionmsg.=$message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
$actionmsg2=$langs->transnoentities('Action'.$actiontypecode);
|
||||
}
|
||||
|
||||
@ -745,12 +745,13 @@ if ($action == 'send' && ! GETPOST('cancel','alpha') && (empty($conf->global->MA
|
||||
if (strlen(GETPOST('subject','alphs'))) $subject = GETPOST('subject','alpha');
|
||||
else $subject = $langs->transnoentities('Intervention').' '.$object->ref;
|
||||
$actiontypecode='AC_OTH_AUTO';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($message)
|
||||
{
|
||||
$actionmsg.=$langs->transnoentities('MailTopic').": ".$subject."\n";
|
||||
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
|
||||
$actionmsg.=$message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
$actionmsg2=$langs->transnoentities("InterventionSentByEMail",$object->ref);
|
||||
}
|
||||
|
||||
@ -56,10 +56,11 @@ if (! $sortfield)
|
||||
}
|
||||
$limit = $conf->liste_limit;
|
||||
|
||||
$search_ref=GETPOST('search_ref','alpha');
|
||||
$search_ref=GETPOST('search_ref')?GETPOST('search_ref','alpha'):GETPOST('search_inter','alpha');
|
||||
$search_company=GETPOST('search_company','alpha');
|
||||
$search_desc=GETPOST('search_desc','alpha');
|
||||
$search_status=GETPOST('search_status');
|
||||
$sall=GETPOST('sall');
|
||||
|
||||
|
||||
/*
|
||||
@ -99,6 +100,11 @@ if (! $user->rights->societe->client->voir && empty($socid))
|
||||
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id;
|
||||
if ($socid)
|
||||
$sql.= " AND s.rowid = " . $socid;
|
||||
if ($sall) {
|
||||
$arraytosearch=array('f.ref', 'f.description', 's.nom');
|
||||
if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) $arraytosearch=array('f.ref', 'f.description', 's.nom', 'fd.description');
|
||||
$sql .= natural_search($arraytosearch, $sall);
|
||||
}
|
||||
$sql.= $db->order($sortfield,$sortorder);
|
||||
$sql.= $db->plimit($limit+1, $offset);
|
||||
//print $sql;
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
* \brief File that include conf.php file and commons lib like functions.lib.php
|
||||
*/
|
||||
|
||||
if (! defined('DOL_VERSION')) define('DOL_VERSION','3.7.0-alpha');
|
||||
if (! defined('DOL_VERSION')) define('DOL_VERSION','3.7.0-beta');
|
||||
if (! defined('EURO')) define('EURO',chr(128));
|
||||
|
||||
// Define syslog constants
|
||||
|
||||
@ -1928,6 +1928,47 @@ class CommandeFournisseur extends CommonOrder
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charge indicateurs this->nb de tableau de bord
|
||||
*
|
||||
* @return int <0 si ko, >0 si ok
|
||||
*/
|
||||
function load_state_board()
|
||||
{
|
||||
global $conf, $user;
|
||||
|
||||
$this->nb=array();
|
||||
$clause = "WHERE";
|
||||
|
||||
$sql = "SELECT count(co.rowid) as nb";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as co";
|
||||
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON co.fk_soc = s.rowid";
|
||||
if (!$user->rights->societe->client->voir && !$user->societe_id)
|
||||
{
|
||||
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc";
|
||||
$sql.= " WHERE sc.fk_user = " .$user->id;
|
||||
$clause = "AND";
|
||||
}
|
||||
$sql.= " ".$clause." co.entity = ".$conf->entity;
|
||||
|
||||
$resql=$this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
while ($obj=$this->db->fetch_object($resql))
|
||||
{
|
||||
$this->nb["supplier_orders"]=$obj->nb;
|
||||
}
|
||||
$this->db->free($resql);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
dol_print_error($this->db);
|
||||
$this->error=$this->db->error();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load indicators for dashboard (this->nbtodo and this->nbtodolate)
|
||||
*
|
||||
|
||||
@ -1614,6 +1614,48 @@ class FactureFournisseur extends CommonInvoice
|
||||
$this->total_ttc = $xnbp*119.6;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load indicators for dashboard (this->nbtodo and this->nbtodolate)
|
||||
*
|
||||
* @return int <0 if KO, >0 if OK
|
||||
*/
|
||||
function load_state_board()
|
||||
{
|
||||
global $conf, $user;
|
||||
|
||||
$this->nb=array();
|
||||
|
||||
$clause = "WHERE";
|
||||
|
||||
$sql = "SELECT count(f.rowid) as nb";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."facture_fourn as f";
|
||||
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON f.fk_soc = s.rowid";
|
||||
if (!$user->rights->societe->client->voir && !$user->societe_id)
|
||||
{
|
||||
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc";
|
||||
$sql.= " WHERE sc.fk_user = " .$user->id;
|
||||
$clause = "AND";
|
||||
}
|
||||
$sql.= " ".$clause." f.entity = ".$conf->entity;
|
||||
|
||||
$resql=$this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
while ($obj=$this->db->fetch_object($resql))
|
||||
{
|
||||
$this->nb["supplier_invoices"]=$obj->nb;
|
||||
}
|
||||
$this->db->free($resql);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
dol_print_error($this->db);
|
||||
$this->error=$this->db->error();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load an object from its id and create a new one in database
|
||||
*
|
||||
|
||||
@ -467,7 +467,7 @@ class ProductFournisseur extends Product
|
||||
|
||||
$sql = "SELECT s.nom as supplier_name, s.rowid as fourn_id,";
|
||||
$sql.= " pfp.rowid as product_fourn_price_id, pfp.ref_fourn,";
|
||||
$sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.tva_tx, pfp.charges, pfp.unitcharges";
|
||||
$sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.tva_tx, pfp.charges, pfp.unitcharges, ";
|
||||
$sql.= " pfp.remise, pfp.remise_percent";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
|
||||
$sql.= " WHERE s.entity IN (".getEntity('societe', 1).")";
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
* Copyright (C) 2011 Philippe Grand <philippe.grand@atoo-net.com>
|
||||
* Copyright (C) 2012 Marcos García <marcosgdf@gmail.com>
|
||||
* Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
|
||||
* Copyright (C) 2014 Ion Agorria <ion@agorria.com>
|
||||
*
|
||||
* 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
|
||||
@ -43,7 +44,9 @@ if (!empty($conf->produit->enabled))
|
||||
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
|
||||
if (!empty($conf->projet->enabled))
|
||||
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
|
||||
require_once NUSOAP_PATH.'/nusoap.php'; // Include SOAP
|
||||
|
||||
$langs->load('admin');
|
||||
$langs->load('orders');
|
||||
$langs->load('sendings');
|
||||
$langs->load('companies');
|
||||
@ -941,12 +944,13 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G
|
||||
if (dol_strlen(GETPOST('subject'))) $subject=GETPOST('subject');
|
||||
else $subject = $langs->transnoentities('CustomerOrder').' '.$object->ref;
|
||||
$actiontypecode='AC_SUP_ORD';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($message)
|
||||
{
|
||||
$actionmsg.=$langs->transnoentities('MailTopic').": ".$subject."\n";
|
||||
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
|
||||
$actionmsg.=$message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
$actionmsg2=$langs->transnoentities('Action'.$actiontypecode);
|
||||
}
|
||||
@ -1044,6 +1048,99 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G
|
||||
}
|
||||
}
|
||||
|
||||
if ($action == 'webservice' && GETPOST('mode', 'alpha') == "send" && ! GETPOST('cancel'))
|
||||
{
|
||||
$ws_url = $object->thirdparty->webservices_url;
|
||||
$ws_key = $object->thirdparty->webservices_key;
|
||||
$ws_user = GETPOST('ws_user','alpha');
|
||||
$ws_password = GETPOST('ws_password','alpha');
|
||||
$ws_entity = GETPOST('ws_entity','int');
|
||||
$ws_thirdparty = GETPOST('ws_thirdparty','int');
|
||||
|
||||
// NS and Authentication parameters
|
||||
$ws_ns='http://www.dolibarr.org/ns/';
|
||||
$ws_authentication=array(
|
||||
'dolibarrkey'=>$ws_key,
|
||||
'sourceapplication'=>'DolibarrWebServiceClient',
|
||||
'login'=>$ws_user,
|
||||
'password'=>$ws_password,
|
||||
'entity'=>$ws_entity
|
||||
);
|
||||
|
||||
//Is sync supplier web services module activated? and everything filled?
|
||||
if (empty($conf->syncsupplierwebservices->enabled)) {
|
||||
setEventMessage($langs->trans("WarningModuleNotActive",$langs->transnoentities("Module2650Name")));
|
||||
} else if (empty($ws_url) || empty($ws_key)) {
|
||||
setEventMessage($langs->trans("ErrorWebServicesFieldsRequired"), 'errors');
|
||||
} else if (empty($ws_user) || empty($ws_password) || empty($ws_thirdparty)) {
|
||||
setEventMessage($langs->trans("ErrorFieldsRequired"), 'errors');
|
||||
}
|
||||
else
|
||||
{
|
||||
//Create SOAP client and connect it to order
|
||||
$soapclient_order = new nusoap_client($ws_url."/webservices/server_order.php");
|
||||
$soapclient_order->soap_defencoding='UTF-8';
|
||||
$soapclient_order->decodeUTF8(false);
|
||||
|
||||
//Create SOAP client and connect it to product/service
|
||||
$soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
|
||||
$soapclient_product->soap_defencoding='UTF-8';
|
||||
$soapclient_product->decodeUTF8(false);
|
||||
|
||||
//Prepare the order lines from order
|
||||
$order_lines = array();
|
||||
foreach ($object->lines as $line)
|
||||
{
|
||||
$ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $line->ref_supplier);
|
||||
$result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
|
||||
|
||||
if ($result_product["result"]["result_code"] == "OK")
|
||||
{
|
||||
$order_lines[] = array(
|
||||
'desc' => $line->product_desc,
|
||||
'type' => $line->product_type,
|
||||
'product_id' => $result_product["product"]["id"],
|
||||
'vat_rate' => $line->tva_tx,
|
||||
'qty' => $line->qty,
|
||||
'price' => $line->price,
|
||||
'unitprice' => $line->subprice,
|
||||
'total_net' => $line->total_ht,
|
||||
'total_vat' => $line->total_tva,
|
||||
'total' => $line->total_ttc,
|
||||
'date_start' => $line->date_start,
|
||||
'date_end' => $line->date_end,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//Prepare the order header
|
||||
$order = array(
|
||||
'thirdparty_id' => $ws_thirdparty,
|
||||
'date' => dol_print_date(dol_now(),'dayrfc'),
|
||||
'total_net' => $object->total_ht,
|
||||
'total_var' => $object->total_tva,
|
||||
'total' => $object->total_ttc,
|
||||
'lines' => $order_lines
|
||||
);
|
||||
|
||||
$ws_parameters = array('authentication'=>$ws_authentication, 'order' => $order);
|
||||
$result_order = $soapclient_order->call("createOrder", $ws_parameters, $ws_ns, '');
|
||||
|
||||
if (empty($result_order["result"]["result_code"])) //No result, check error str
|
||||
{
|
||||
setEventMessage($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", 'errors');
|
||||
}
|
||||
else if ($result_order["result"]["result_code"] != "OK") //Something went wrong
|
||||
{
|
||||
setEventMessage($langs->trans("SOAPError")." '".$result_order["result"]["result_code"]."' - '".$result_order["result"]["result_label"]."'", 'errors');
|
||||
}
|
||||
else
|
||||
{
|
||||
setEventMessage($langs->trans("RemoteOrderRef")." ".$result_order["ref"], 'mesgs');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->fournisseur->commande->creer)
|
||||
{
|
||||
if ($action == 'addcontact')
|
||||
@ -1769,7 +1866,324 @@ elseif (! empty($object->id))
|
||||
dol_fiche_end();
|
||||
|
||||
|
||||
if ($action != 'presend')
|
||||
/*
|
||||
* Action presend
|
||||
*/
|
||||
if ($action == 'presend')
|
||||
{
|
||||
$ref = dol_sanitizeFileName($object->ref);
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
$fileparams = dol_most_recent_file($conf->fournisseur->commande->dir_output . '/' . $ref, preg_quote($ref,'/'));
|
||||
$file=$fileparams['fullname'];
|
||||
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
$newlang = '';
|
||||
if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id']))
|
||||
$newlang = $_REQUEST['lang_id'];
|
||||
if ($conf->global->MAIN_MULTILANGS && empty($newlang))
|
||||
$newlang = $object->client->default_lang;
|
||||
|
||||
if (!empty($newlang))
|
||||
{
|
||||
$outputlangs = new Translate('', $conf);
|
||||
$outputlangs->setDefaultLang($newlang);
|
||||
$outputlangs->load('commercial');
|
||||
}
|
||||
|
||||
// Build document if it not exists
|
||||
if (! $file || ! is_readable($file))
|
||||
{
|
||||
$result= $object->generateDocument(GETPOST('model')?GETPOST('model'):$object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
||||
if ($result <= 0)
|
||||
{
|
||||
dol_print_error($db,$result);
|
||||
exit;
|
||||
}
|
||||
$fileparams = dol_most_recent_file($conf->fournisseur->commande->dir_output . '/' . $ref, preg_quote($ref,'/'));
|
||||
$file=$fileparams['fullname'];
|
||||
}
|
||||
|
||||
print '<br>';
|
||||
|
||||
print_titre($langs->trans('SendOrderByMail'));
|
||||
|
||||
// Cree l'objet formulaire mail
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
|
||||
$formmail = new FormMail($db);
|
||||
$formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang);
|
||||
$formmail->fromtype = 'user';
|
||||
$formmail->fromid = $user->id;
|
||||
$formmail->fromname = $user->getFullName($langs);
|
||||
$formmail->frommail = $user->email;
|
||||
$formmail->withfrom=1;
|
||||
$liste=array();
|
||||
foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key=>$value) $liste[$key]=$value;
|
||||
$formmail->withto=GETPOST("sendto")?GETPOST("sendto"):$liste;
|
||||
$formmail->withtocc=$liste;
|
||||
$formmail->withtoccc=(! empty($conf->global->MAIN_EMAIL_USECCC)?$conf->global->MAIN_EMAIL_USECCC:false);
|
||||
$formmail->withtopic=$outputlangs->trans('SendOrderRef','__ORDERREF__');
|
||||
$formmail->withfile=2;
|
||||
$formmail->withbody=1;
|
||||
$formmail->withdeliveryreceipt=1;
|
||||
$formmail->withcancel=1;
|
||||
// Tableau des substitutions
|
||||
$formmail->substit['__ORDERREF__']=$object->ref;
|
||||
$formmail->substit['__SIGNATURE__']=$user->signature;
|
||||
$formmail->substit['__PERSONALIZED__']='';
|
||||
$formmail->substit['__CONTACTCIVNAME__']='';
|
||||
|
||||
//Find the good contact adress
|
||||
$custcontact='';
|
||||
$contactarr=array();
|
||||
$contactarr=$object->liste_contact(-1,'external');
|
||||
|
||||
if (is_array($contactarr) && count($contactarr)>0) {
|
||||
foreach($contactarr as $contact) {
|
||||
if ($contact['libelle']==$langs->trans('TypeContact_order_supplier_external_BILLING')) {
|
||||
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
|
||||
$contactstatic=new Contact($db);
|
||||
$contactstatic->fetch($contact['id']);
|
||||
$custcontact=$contactstatic->getFullName($langs,1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($custcontact)) {
|
||||
$formmail->substit['__CONTACTCIVNAME__']=$custcontact;
|
||||
}
|
||||
}
|
||||
|
||||
// Tableau des parametres complementaires
|
||||
$formmail->param['action']='send';
|
||||
$formmail->param['models']='order_supplier_send';
|
||||
$formmail->param['orderid']=$object->id;
|
||||
$formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id;
|
||||
|
||||
// Init list of files
|
||||
if (GETPOST("mode")=='init')
|
||||
{
|
||||
$formmail->clear_attached_files();
|
||||
$formmail->add_attached_files($file,basename($file),dol_mimetype($file));
|
||||
}
|
||||
|
||||
// Show form
|
||||
print $formmail->get_form();
|
||||
|
||||
print '<br>';
|
||||
}
|
||||
/*
|
||||
* Action webservice
|
||||
*/
|
||||
elseif ($action == 'webservice' && GETPOST('mode', 'alpha') != "send" && ! GETPOST('cancel'))
|
||||
{
|
||||
$mode = GETPOST('mode', 'alpha');
|
||||
$ws_url = $object->thirdparty->webservices_url;
|
||||
$ws_key = $object->thirdparty->webservices_key;
|
||||
$ws_user = GETPOST('ws_user','alpha');
|
||||
$ws_password = GETPOST('ws_password','alpha');
|
||||
|
||||
// NS and Authentication parameters
|
||||
$ws_ns = 'http://www.dolibarr.org/ns/';
|
||||
$ws_authentication = array(
|
||||
'dolibarrkey'=>$ws_key,
|
||||
'sourceapplication'=>'DolibarrWebServiceClient',
|
||||
'login'=>$ws_user,
|
||||
'password'=>$ws_password,
|
||||
'entity'=>''
|
||||
);
|
||||
|
||||
print_titre($langs->trans('CreateRemoteOrder'));
|
||||
|
||||
//Is everything filled?
|
||||
if (empty($ws_url) || empty($ws_key)) {
|
||||
setEventMessage($langs->trans("ErrorWebServicesFieldsRequired"), 'errors');
|
||||
$mode = "init";
|
||||
$error_occurred = true; //Don't allow to set the user/pass if thirdparty fields are not filled
|
||||
} else if ($mode != "init" && (empty($ws_user) || empty($ws_password))) {
|
||||
setEventMessage($langs->trans("ErrorFieldsRequired"), 'errors');
|
||||
$mode = "init";
|
||||
}
|
||||
|
||||
if ($mode == "init")
|
||||
{
|
||||
//Table/form header
|
||||
print '<table class="border" width="100%">';
|
||||
print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="webservice">';
|
||||
print '<input type="hidden" name="mode" value="check">';
|
||||
|
||||
if ($error_occurred)
|
||||
{
|
||||
print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
|
||||
print '<input class="button" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
|
||||
}
|
||||
else
|
||||
{
|
||||
$textinput_size = "50";
|
||||
// Webservice url
|
||||
print '<tr><td>'.$langs->trans("WebServiceURL").'</td><td colspan="3">'.dol_print_url($ws_url).'</td></tr>';
|
||||
//Remote User
|
||||
print '<tr><td>'.$langs->trans("User").'</td><td><input size="'.$textinput_size.'" type="text" name="ws_user"></td></tr>';
|
||||
//Remote Password
|
||||
print '<tr><td>'.$langs->trans("Password").'</td><td><input size="'.$textinput_size.'" type="text" name="ws_password"></td></tr>';
|
||||
//Submit button
|
||||
print '<tr><td align="center" colspan="2">';
|
||||
print '<input class="button" type="submit" id="ws_submit" name="ws_submit" value="'.$langs->trans("CreateRemoteOrder").'">';
|
||||
print ' ';
|
||||
//Cancel button
|
||||
print '<input class="button" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
|
||||
print '</td></tr>';
|
||||
}
|
||||
|
||||
//End table/form
|
||||
print '</form>';
|
||||
print '</table>';
|
||||
}
|
||||
elseif ($mode == "check")
|
||||
{
|
||||
$ws_entity = '';
|
||||
$ws_thirdparty = '';
|
||||
$error_occurred = false;
|
||||
|
||||
//Create SOAP client and connect it to user
|
||||
$soapclient_user = new nusoap_client($ws_url."/webservices/server_user.php");
|
||||
$soapclient_user->soap_defencoding='UTF-8';
|
||||
$soapclient_user->decodeUTF8(false);
|
||||
|
||||
//Get the thirdparty associated to user
|
||||
$ws_parameters = array('authentication'=>$ws_authentication, 'id' => '', 'ref'=>$ws_user);
|
||||
$result_user = $soapclient_user->call("getUser", $ws_parameters, $ws_ns, '');
|
||||
$user_status_code = $result_user["result"]["result_code"];
|
||||
|
||||
if ($user_status_code == "OK")
|
||||
{
|
||||
//Fill the variables
|
||||
$ws_entity = $result_user["user"]["entity"];
|
||||
$ws_authentication['entity'] = $ws_entity;
|
||||
$ws_thirdparty = $result_user["user"]["fk_thirdparty"];
|
||||
if (empty($ws_thirdparty))
|
||||
{
|
||||
setEventMessage($langs->trans("RemoteUserMissingAssociatedSoc"), 'errors');
|
||||
$error_occurred = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Create SOAP client and connect it to product/service
|
||||
$soapclient_product = new nusoap_client($ws_url."/webservices/server_productorservice.php");
|
||||
$soapclient_product->soap_defencoding='UTF-8';
|
||||
$soapclient_product->decodeUTF8(false);
|
||||
|
||||
// Iterate each line and get the reference that uses the supplier of that product/service
|
||||
$i = 0;
|
||||
foreach ($object->lines as $line) {
|
||||
$i = $i + 1;
|
||||
$ref_supplier = $line->ref_supplier;
|
||||
$line_id = $i."º) ".$line->product_ref.": ";
|
||||
if (empty($ref_supplier)) {
|
||||
continue;
|
||||
}
|
||||
$ws_parameters = array('authentication' => $ws_authentication, 'id' => '', 'ref' => $ref_supplier);
|
||||
$result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, '');
|
||||
if (!$result_product)
|
||||
{
|
||||
setEventMessage($line_id.$langs->trans("SOAPError")." ".$soapclient_product->error_str." - ".$soapclient_product->response, 'errors');
|
||||
$error_occurred = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check the result code
|
||||
$status_code = $result_product["result"]["result_code"];
|
||||
if (empty($status_code)) //No result, check error str
|
||||
{
|
||||
setEventMessage($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", 'errors');
|
||||
}
|
||||
else if ($status_code != "OK") //Something went wrong
|
||||
{
|
||||
if ($status_code == "NOT_FOUND")
|
||||
{
|
||||
setEventMessage($line_id.$langs->trans("SupplierMissingRef")." '".$ref_supplier."'", 'warnings');
|
||||
}
|
||||
else
|
||||
{
|
||||
setEventMessage($line_id.$langs->trans("ResponseNonOK")." '".$status_code."' - '".$result_product["result"]["result_label"]."'", 'errors');
|
||||
$error_occurred = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Ensure that price is equal and warn user if it's not
|
||||
$supplier_price = price($result_product["product"]["price_net"]); //Price of client tab in supplier dolibarr
|
||||
$local_price = NULL; //Price of supplier as stated in product suppliers tab on this dolibarr, NULL if not found
|
||||
|
||||
$product_fourn = new ProductFournisseur($db);
|
||||
$product_fourn_list = $product_fourn->list_product_fournisseur_price($line->fk_product);
|
||||
if (count($product_fourn_list)>0)
|
||||
{
|
||||
foreach($product_fourn_list as $product_fourn_line)
|
||||
{
|
||||
//Only accept the line where the supplier is the same at this order and has the same ref
|
||||
if ($product_fourn_line->fourn_id == $object->socid && $product_fourn_line->fourn_ref == $ref_supplier) {
|
||||
$local_price = price($product_fourn_line->fourn_price);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($local_price != NULL && $local_price != $supplier_price) {
|
||||
setEventMessage($line_id.$langs->trans("RemotePriceMismatch")." ".$supplier_price." - ".$local_price, 'warnings');
|
||||
}
|
||||
|
||||
// Check if is in sale
|
||||
if (empty($result_product["product"]["status_tosell"])) {
|
||||
setEventMessage($line_id.$langs->trans("ProductStatusNotOnSellShort")." '".$ref_supplier."'", 'warnings');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
elseif ($user_status_code == "PERMISSION_DENIED")
|
||||
{
|
||||
setEventMessage($langs->trans("RemoteUserNotPermission"), 'errors');
|
||||
$error_occurred = true;
|
||||
}
|
||||
elseif ($user_status_code == "BAD_CREDENTIALS")
|
||||
{
|
||||
setEventMessage($langs->trans("RemoteUserBadCredentials"), 'errors');
|
||||
$error_occurred = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
setEventMessage($langs->trans("ResponseNonOK")." '".$user_status_code."'", 'errors');
|
||||
$error_occurred = true;
|
||||
}
|
||||
|
||||
//Form
|
||||
print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
|
||||
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
||||
print '<input type="hidden" name="action" value="webservice">';
|
||||
print '<input type="hidden" name="mode" value="send">';
|
||||
print '<input type="hidden" name="ws_user" value="'.$ws_user.'">';
|
||||
print '<input type="hidden" name="ws_password" value="'.$ws_password.'">';
|
||||
print '<input type="hidden" name="ws_entity" value="'.$ws_entity.'">';
|
||||
print '<input type="hidden" name="ws_thirdparty" value="'.$ws_thirdparty.'">';
|
||||
if ($error_occurred)
|
||||
{
|
||||
print "<br>".$langs->trans("ErrorOccurredReviseAndRetry")."<br>";
|
||||
}
|
||||
else
|
||||
{
|
||||
print '<input class="button" type="submit" id="ws_submit" name="ws_submit" value="'.$langs->trans("Confirm").'">';
|
||||
print ' ';
|
||||
}
|
||||
print '<input class="button" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
|
||||
print '</form>';
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Show buttons
|
||||
*/
|
||||
else
|
||||
{
|
||||
/**
|
||||
* Boutons actions
|
||||
@ -1849,6 +2263,13 @@ elseif (! empty($object->id))
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
// Create a remote order using WebService only if module is activated
|
||||
if (! empty($conf->syncsupplierwebservices->enabled) && $object->statut >= 2) // 2 means accepted
|
||||
{
|
||||
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=webservice&mode=init">'.$langs->trans('CreateRemoteOrder').'</a>';
|
||||
}
|
||||
|
||||
// Cancel
|
||||
if ($object->statut == 2)
|
||||
{
|
||||
@ -1975,112 +2396,6 @@ elseif (! empty($object->id))
|
||||
print '</div></div></div>';
|
||||
}
|
||||
|
||||
/*
|
||||
* Action presend
|
||||
*/
|
||||
if ($action == 'presend')
|
||||
{
|
||||
$ref = dol_sanitizeFileName($object->ref);
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
$fileparams = dol_most_recent_file($conf->fournisseur->commande->dir_output . '/' . $ref, preg_quote($ref,'/'));
|
||||
$file=$fileparams['fullname'];
|
||||
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
$newlang = '';
|
||||
if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id']))
|
||||
$newlang = $_REQUEST['lang_id'];
|
||||
if ($conf->global->MAIN_MULTILANGS && empty($newlang))
|
||||
$newlang = $object->client->default_lang;
|
||||
|
||||
if (!empty($newlang))
|
||||
{
|
||||
$outputlangs = new Translate('', $conf);
|
||||
$outputlangs->setDefaultLang($newlang);
|
||||
$outputlangs->load('commercial');
|
||||
}
|
||||
|
||||
// Build document if it not exists
|
||||
if (! $file || ! is_readable($file))
|
||||
{
|
||||
$result= $object->generateDocument(GETPOST('model')?GETPOST('model'):$object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
||||
if ($result <= 0)
|
||||
{
|
||||
dol_print_error($db,$result);
|
||||
exit;
|
||||
}
|
||||
$fileparams = dol_most_recent_file($conf->fournisseur->commande->dir_output . '/' . $ref, preg_quote($ref,'/'));
|
||||
$file=$fileparams['fullname'];
|
||||
}
|
||||
|
||||
print '<br>';
|
||||
|
||||
print_titre($langs->trans('SendOrderByMail'));
|
||||
|
||||
// Cree l'objet formulaire mail
|
||||
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
|
||||
$formmail = new FormMail($db);
|
||||
$formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang);
|
||||
$formmail->fromtype = 'user';
|
||||
$formmail->fromid = $user->id;
|
||||
$formmail->fromname = $user->getFullName($langs);
|
||||
$formmail->frommail = $user->email;
|
||||
$formmail->withfrom=1;
|
||||
$liste=array();
|
||||
foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key=>$value) $liste[$key]=$value;
|
||||
$formmail->withto=GETPOST("sendto")?GETPOST("sendto"):$liste;
|
||||
$formmail->withtocc=$liste;
|
||||
$formmail->withtoccc=(! empty($conf->global->MAIN_EMAIL_USECCC)?$conf->global->MAIN_EMAIL_USECCC:false);
|
||||
$formmail->withtopic=$outputlangs->trans('SendOrderRef','__ORDERREF__');
|
||||
$formmail->withfile=2;
|
||||
$formmail->withbody=1;
|
||||
$formmail->withdeliveryreceipt=1;
|
||||
$formmail->withcancel=1;
|
||||
// Tableau des substitutions
|
||||
$formmail->substit['__ORDERREF__']=$object->ref;
|
||||
$formmail->substit['__SIGNATURE__']=$user->signature;
|
||||
$formmail->substit['__PERSONALIZED__']='';
|
||||
$formmail->substit['__CONTACTCIVNAME__']='';
|
||||
|
||||
//Find the good contact adress
|
||||
$custcontact='';
|
||||
$contactarr=array();
|
||||
$contactarr=$object->liste_contact(-1,'external');
|
||||
|
||||
if (is_array($contactarr) && count($contactarr)>0) {
|
||||
foreach($contactarr as $contact) {
|
||||
if ($contact['libelle']==$langs->trans('TypeContact_order_supplier_external_BILLING')) {
|
||||
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
|
||||
$contactstatic=new Contact($db);
|
||||
$contactstatic->fetch($contact['id']);
|
||||
$custcontact=$contactstatic->getFullName($langs,1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($custcontact)) {
|
||||
$formmail->substit['__CONTACTCIVNAME__']=$custcontact;
|
||||
}
|
||||
}
|
||||
|
||||
// Tableau des parametres complementaires
|
||||
$formmail->param['action']='send';
|
||||
$formmail->param['models']='order_supplier_send';
|
||||
$formmail->param['orderid']=$object->id;
|
||||
$formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id;
|
||||
|
||||
// Init list of files
|
||||
if (GETPOST("mode")=='init')
|
||||
{
|
||||
$formmail->clear_attached_files();
|
||||
$formmail->add_attached_files($file,basename($file),dol_mimetype($file));
|
||||
}
|
||||
|
||||
// Show form
|
||||
print $formmail->get_form();
|
||||
|
||||
print '<br>';
|
||||
}
|
||||
|
||||
print '</td></tr></table>';
|
||||
}
|
||||
|
||||
|
||||
@ -903,12 +903,13 @@ if ($action == 'send' && ! $_POST['addfile'] && ! $_POST['removedfile'] && ! $_P
|
||||
if (dol_strlen($_POST['subject'])) $subject=$_POST['subject'];
|
||||
else $subject = $langs->transnoentities('CustomerOrder').' '.$object->ref;
|
||||
$actiontypecode='AC_SUP_INV';
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
|
||||
$actionmsg = $langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
|
||||
if ($message)
|
||||
{
|
||||
$actionmsg.=$langs->transnoentities('MailTopic').": ".$subject."\n";
|
||||
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
|
||||
$actionmsg.=$message;
|
||||
if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
|
||||
$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
|
||||
$actionmsg = dol_concatdesc($actionmsg, $message);
|
||||
}
|
||||
$actionmsg2=$langs->transnoentities('Action'.$actiontypecode);
|
||||
}
|
||||
|
||||
21
htdocs/includes/jquery/plugins/multiple-select/LICENSE
Normal file
21
htdocs/includes/jquery/plugins/multiple-select/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2012-2014 Zhixin Wen <wenzhixin2010@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
96
htdocs/includes/jquery/plugins/multiple-select/README.md
Normal file
96
htdocs/includes/jquery/plugins/multiple-select/README.md
Normal file
@ -0,0 +1,96 @@
|
||||
# Multiple Select
|
||||
|
||||
Multiple select is a jQuery plugin to select multiple elements with checkboxes :).
|
||||
|
||||
To get started checkout examples and documentation at http://wenzhixin.net.cn/p/multiple-select
|
||||
|
||||
## Contributors
|
||||
|
||||
Multiple select is due to the excellent work of the following contributors:
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr><th align="left">文翼</th><td><a href="https://github.com/wenzhixin">GitHub/wenzhixin</a></td></tr>
|
||||
<tr><th align="left">Gaurav Jassal</th><td><a href="https://github.com/creativeaura">GitHub/creativeaura</a></td><</tr>
|
||||
<tr><th align="left">guli</th><td><a href="https://github.com/guli">GitHub/guli</a></td></tr>
|
||||
<tr><th align="left">jwheadon</th><td><a href="https://github.com/jwheadon">GitHub/jwheadon</a></td></tr>
|
||||
<tr><th align="left">yx</th><td><a href="https://github.com/qqfish">GitHub/qqfish</a></td></tr>
|
||||
<tr><th align="left">Tobias Macey</th><td><a href="https://github.com/blarghmatey">GitHub/blarghmatey</a></td></tr>
|
||||
<tr><th align="left">Jona Goldman</th><td><a href="https://github.com/jonagoldman">GitHub/jonagoldman</a></td></tr>
|
||||
<tr><th align="left">Alex Jeffrey</th><td><a href="https://github.com/ajeffrey">GitHub/ajeffrey</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Changelog
|
||||
|
||||
### 1.1.0
|
||||
|
||||
* Fix #63: Add ```keepOpen``` option.
|
||||
* Fix #62: Fix ```isOpen``` and ```filter``` options are both true bug.
|
||||
* Fix #57: Fire onCheckAll event when literally select.
|
||||
* Add data attributes for support.
|
||||
* Fix #55: Add ```name``` option.
|
||||
|
||||
### 1.0.9
|
||||
|
||||
* Fix #42: Add ```styler``` option to custom item style.
|
||||
* Fix firefox click bug.
|
||||
* Add ```allSelected```, ```minumimCountSelected``` and ```countSelected``` options.
|
||||
* Fix #35: Add ```onFocus``` and ```onBlur``` events.
|
||||
* Fix #25: Add ```focus``` and ```blur``` methods.
|
||||
* Fix #31: Trigger the onCheckAll & onUncheckAll events when use filter to select all.
|
||||
|
||||
### 1.0.8
|
||||
|
||||
* Update the license to The MIT License.
|
||||
* Fix #47: Add ```No matches found``` message when there are no results found.
|
||||
* Fix #43: Add ```position``` option.
|
||||
|
||||
### 1.0.7
|
||||
|
||||
* Fix #44: The filters not working bugs.
|
||||
|
||||
### 1.0.6
|
||||
|
||||
* Fix #21: Add ```single``` option.
|
||||
* Add ```override``` option.
|
||||
* Add ```container``` option.
|
||||
* Fix #29: Update the optgroups select text.
|
||||
* Fix #30: Image is not shown in Firefox 25.0.1.
|
||||
* Fix #22: fix group filter problem.
|
||||
|
||||
### 1.0.5
|
||||
|
||||
* Update the button text witdh.
|
||||
* Add keyboard support.
|
||||
|
||||
### 1.0.4
|
||||
|
||||
* Fix #12: Add ```width``` option.
|
||||
* Fix #11: Add callback events.
|
||||
* Add ```maxHeight``` option.
|
||||
|
||||
### 1.0.3
|
||||
|
||||
* Fix #4: Add ```filter``` option.
|
||||
* Support mobile devices.
|
||||
* Fix #6: Add ```refresh``` method.
|
||||
|
||||
### 1.0.2
|
||||
|
||||
* Fix #7: Add ```selected``` and ```disabled``` options.
|
||||
* Fix #5: Add ```checkAll``` and ```uncheckAll``` methods.
|
||||
|
||||
### 1.0.1
|
||||
|
||||
* Fix #3: Add optgroups support.
|
||||
* Add ```placeholder``` option.
|
||||
* Fix #2: use prop method instead of attr.
|
||||
|
||||
### 1.0.0
|
||||
|
||||
* Initial release
|
||||
|
||||
## LICENSE
|
||||
|
||||
[The MIT License](https://github.com/wenzhixin/multiple-select/blob/master/LICENSE)
|
||||
@ -0,0 +1,466 @@
|
||||
/**
|
||||
* @author zhixin wen <wenzhixin2010@gmail.com>
|
||||
* @version 1.1.0
|
||||
*
|
||||
* http://wenzhixin.net.cn/p/multiple-select/
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
'use strict';
|
||||
|
||||
function MultipleSelect($el, options) {
|
||||
var that = this,
|
||||
name = $el.attr('name') || options.name || '',
|
||||
elWidth = $el.width();
|
||||
|
||||
this.$el = $el.hide();
|
||||
this.options = options;
|
||||
|
||||
this.$parent = $('<div class="ms-parent"></div>');
|
||||
this.$choice = $('<button type="button" class="ms-choice"><span class="placeholder">' +
|
||||
options.placeholder + '</span><div></div></button>');
|
||||
this.$drop = $('<div class="ms-drop ' + options.position + '"></div>');
|
||||
this.$el.after(this.$parent);
|
||||
this.$parent.append(this.$choice);
|
||||
this.$parent.append(this.$drop);
|
||||
|
||||
if (this.$el.prop('disabled')) {
|
||||
this.$choice.addClass('disabled');
|
||||
}
|
||||
this.$choice.css('width', elWidth + 'px');
|
||||
this.$drop.css({
|
||||
width: (options.width || elWidth) + 'px'
|
||||
});
|
||||
|
||||
if (!this.options.keepOpen) {
|
||||
$('body').click(function(e) {
|
||||
if ($(e.target)[0] === that.$choice[0] ||
|
||||
$(e.target).parents('.ms-choice')[0] === that.$choice[0]) {
|
||||
return;
|
||||
}
|
||||
if (($(e.target)[0] === that.$drop[0] ||
|
||||
$(e.target).parents('.ms-drop')[0] !== that.$drop[0]) &&
|
||||
that.options.isOpen) {
|
||||
that.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
this.selectAllName = 'name="selectAll' + name + '"';
|
||||
this.selectGroupName = 'name="selectGroup' + name + '"';
|
||||
this.selectItemName = 'name="selectItem' + name + '"';
|
||||
}
|
||||
|
||||
MultipleSelect.prototype = {
|
||||
constructor : MultipleSelect,
|
||||
|
||||
init: function() {
|
||||
var that = this,
|
||||
html = [];
|
||||
if (this.options.filter) {
|
||||
html.push(
|
||||
'<div class="ms-search">',
|
||||
'<input type="text" autocomplete="off" autocorrect="off" autocapitilize="off" spellcheck="false">',
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
html.push('<ul>');
|
||||
if (this.options.selectAll && !this.options.single) {
|
||||
html.push(
|
||||
'<li>',
|
||||
'<label>',
|
||||
'<input type="checkbox" ' + this.selectAllName + ' /> ',
|
||||
'[' + this.options.selectAllText + ']',
|
||||
'</label>',
|
||||
'</li>'
|
||||
);
|
||||
}
|
||||
$.each(this.$el.children(), function(i, elm) {
|
||||
html.push(that.optionToHtml(i, elm));
|
||||
});
|
||||
html.push('<li class="ms-no-results">No matches found</li>');
|
||||
html.push('</ul>');
|
||||
this.$drop.html(html.join(''));
|
||||
this.$drop.find('ul').css('max-height', this.options.maxHeight + 'px');
|
||||
this.$drop.find('.multiple').css('width', this.options.multipleWidth + 'px');
|
||||
|
||||
this.$searchInput = this.$drop.find('.ms-search input');
|
||||
this.$selectAll = this.$drop.find('input[' + this.selectAllName + ']');
|
||||
this.$selectGroups = this.$drop.find('input[' + this.selectGroupName + ']');
|
||||
this.$selectItems = this.$drop.find('input[' + this.selectItemName + ']:enabled');
|
||||
this.$disableItems = this.$drop.find('input[' + this.selectItemName + ']:disabled');
|
||||
this.$noResults = this.$drop.find('.ms-no-results');
|
||||
this.events();
|
||||
this.update();
|
||||
|
||||
if (this.options.isOpen) {
|
||||
this.open();
|
||||
}
|
||||
},
|
||||
|
||||
optionToHtml: function(i, elm, group, groupDisabled) {
|
||||
var that = this,
|
||||
$elm = $(elm),
|
||||
html = [],
|
||||
multiple = this.options.multiple,
|
||||
disabled,
|
||||
type = this.options.single ? 'radio' : 'checkbox';
|
||||
|
||||
if ($elm.is('option')) {
|
||||
var value = $elm.val(),
|
||||
text = $elm.text(),
|
||||
selected = $elm.prop('selected'),
|
||||
style = this.options.styler(value) ? ' style="' + this.options.styler(value) + '"' : '';
|
||||
|
||||
disabled = groupDisabled || $elm.prop('disabled');
|
||||
html.push(
|
||||
'<li' + (multiple ? ' class="multiple"' : '') + style + '>',
|
||||
'<label' + (disabled ? ' class="disabled"' : '') + '>',
|
||||
'<input type="' + type + '" ' + this.selectItemName + ' value="' + value + '"' +
|
||||
(selected ? ' checked="checked"' : '') +
|
||||
(disabled ? ' disabled="disabled"' : '') +
|
||||
(group ? ' data-group="' + group + '"' : '') +
|
||||
'/> ',
|
||||
text,
|
||||
'</label>',
|
||||
'</li>'
|
||||
);
|
||||
} else if (!group && $elm.is('optgroup')) {
|
||||
var _group = 'group_' + i,
|
||||
label = $elm.attr('label');
|
||||
|
||||
disabled = $elm.prop('disabled');
|
||||
html.push(
|
||||
'<li class="group">',
|
||||
'<label class="optgroup' + (disabled ? ' disabled' : '') + '" data-group="' + _group + '">',
|
||||
'<input type="checkbox" ' + this.selectGroupName +
|
||||
(disabled ? ' disabled="disabled"' : '') + ' /> ',
|
||||
label,
|
||||
'</label>',
|
||||
'</li>');
|
||||
$.each($elm.children(), function(i, elm) {
|
||||
html.push(that.optionToHtml(i, elm, _group, disabled));
|
||||
});
|
||||
}
|
||||
return html.join('');
|
||||
},
|
||||
|
||||
events: function() {
|
||||
var that = this;
|
||||
this.$choice.off('click').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
that[that.options.isOpen ? 'close' : 'open']();
|
||||
})
|
||||
.off('focus').on('focus', this.options.onFocus)
|
||||
.off('blur').on('blur', this.options.onBlur);
|
||||
|
||||
this.$parent.off('keydown').on('keydown', function(e) {
|
||||
switch (e.which) {
|
||||
case 27: // esc key
|
||||
that.close();
|
||||
that.$choice.focus();
|
||||
break;
|
||||
}
|
||||
});
|
||||
this.$searchInput.off('keyup').on('keyup', function() {
|
||||
that.filter();
|
||||
});
|
||||
this.$selectAll.off('click').on('click', function() {
|
||||
var checked = $(this).prop('checked'),
|
||||
$items = that.$selectItems.filter(':visible');
|
||||
if ($items.length === that.$selectItems.length) {
|
||||
that[checked ? 'checkAll' : 'uncheckAll']();
|
||||
} else { // when the filter option is true
|
||||
that.$selectGroups.prop('checked', checked);
|
||||
$items.prop('checked', checked);
|
||||
that.options[checked ? 'onCheckAll' : 'onUncheckAll']();
|
||||
that.update();
|
||||
}
|
||||
});
|
||||
this.$selectGroups.off('click').on('click', function() {
|
||||
var group = $(this).parent().attr('data-group'),
|
||||
$items = that.$selectItems.filter(':visible'),
|
||||
$children = $items.filter('[data-group="' + group + '"]'),
|
||||
checked = $children.length !== $children.filter(':checked').length;
|
||||
$children.prop('checked', checked);
|
||||
that.updateSelectAll();
|
||||
that.update();
|
||||
that.options.onOptgroupClick({
|
||||
label: $(this).parent().text(),
|
||||
checked: checked,
|
||||
children: $children.get()
|
||||
});
|
||||
});
|
||||
this.$selectItems.off('click').on('click', function() {
|
||||
that.updateSelectAll();
|
||||
that.update();
|
||||
that.updateOptGroupSelect();
|
||||
that.options.onClick({
|
||||
label: $(this).parent().text(),
|
||||
value: $(this).val(),
|
||||
checked: $(this).prop('checked')
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
open: function() {
|
||||
if (this.$choice.hasClass('disabled')) {
|
||||
return;
|
||||
}
|
||||
this.options.isOpen = true;
|
||||
this.$choice.find('>div').addClass('open');
|
||||
this.$drop.show();
|
||||
if (this.options.container) {
|
||||
var offset = this.$drop.offset();
|
||||
this.$drop.appendTo($(this.options.container));
|
||||
this.$drop.offset({ top: offset.top, left: offset.left });
|
||||
}
|
||||
if (this.options.filter) {
|
||||
this.$searchInput.val('');
|
||||
this.filter();
|
||||
}
|
||||
this.options.onOpen();
|
||||
},
|
||||
|
||||
close: function() {
|
||||
this.options.isOpen = false;
|
||||
this.$choice.find('>div').removeClass('open');
|
||||
this.$drop.hide();
|
||||
if (this.options.container) {
|
||||
this.$parent.append(this.$drop);
|
||||
this.$drop.css({
|
||||
'top': 'auto',
|
||||
'left': 'auto'
|
||||
})
|
||||
}
|
||||
this.options.onClose();
|
||||
},
|
||||
|
||||
update: function() {
|
||||
var selects = this.getSelects('text'),
|
||||
$span = this.$choice.find('>span');
|
||||
if (selects.length === this.$selectItems.length + this.$disableItems.length && this.options.allSelected) {
|
||||
$span.removeClass('placeholder').html(this.options.allSelected);
|
||||
} else if (selects.length > this.options.minumimCountSelected && this.options.countSelected) {
|
||||
$span.removeClass('placeholder').html(this.options.countSelected
|
||||
.replace('#', selects.length)
|
||||
.replace('%', this.$selectItems.length + this.$disableItems.length));
|
||||
} else if (selects.length) {
|
||||
$span.removeClass('placeholder').html(selects.join(', '));
|
||||
} else {
|
||||
$span.addClass('placeholder').html(this.options.placeholder);
|
||||
}
|
||||
// set selects to select
|
||||
this.$el.val(this.getSelects());
|
||||
},
|
||||
|
||||
updateSelectAll: function() {
|
||||
var $items = this.$selectItems.filter(':visible');
|
||||
this.$selectAll.prop('checked', $items.length &&
|
||||
$items.length === $items.filter(':checked').length);
|
||||
if (this.$selectAll.prop('checked')) {
|
||||
this.options.onCheckAll();
|
||||
}
|
||||
},
|
||||
|
||||
updateOptGroupSelect: function() {
|
||||
var $items = this.$selectItems.filter(':visible');
|
||||
$.each(this.$selectGroups, function(i, val) {
|
||||
var group = $(val).parent().attr('data-group'),
|
||||
$children = $items.filter('[data-group="' + group + '"]');
|
||||
$(val).prop('checked', $children.length &&
|
||||
$children.length === $children.filter(':checked').length);
|
||||
});
|
||||
},
|
||||
|
||||
//value or text, default: 'value'
|
||||
getSelects: function(type) {
|
||||
var that = this,
|
||||
texts = [],
|
||||
values = [];
|
||||
this.$drop.find('input[' + this.selectItemName + ']:checked').each(function() {
|
||||
texts.push($(this).parent().text());
|
||||
values.push($(this).val());
|
||||
});
|
||||
|
||||
if (type === 'text' && this.$selectGroups.length) {
|
||||
texts = [];
|
||||
this.$selectGroups.each(function() {
|
||||
var html = [],
|
||||
text = $.trim($(this).parent().text()),
|
||||
group = $(this).parent().data('group'),
|
||||
$children = that.$drop.find('[' + that.selectItemName + '][data-group="' + group + '"]'),
|
||||
$selected = $children.filter(':checked');
|
||||
|
||||
if ($selected.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
html.push('[');
|
||||
html.push(text);
|
||||
if ($children.length > $selected.length) {
|
||||
var list = [];
|
||||
$selected.each(function() {
|
||||
list.push($(this).parent().text());
|
||||
});
|
||||
html.push(': ' + list.join(', '));
|
||||
}
|
||||
html.push(']');
|
||||
texts.push(html.join(''));
|
||||
});
|
||||
}
|
||||
return type === 'text' ? texts : values;
|
||||
},
|
||||
|
||||
setSelects: function(values) {
|
||||
var that = this;
|
||||
this.$selectItems.prop('checked', false);
|
||||
$.each(values, function(i, value) {
|
||||
that.$selectItems.filter('[value="' + value + '"]').prop('checked', true);
|
||||
});
|
||||
this.$selectAll.prop('checked', this.$selectItems.length ===
|
||||
this.$selectItems.filter(':checked').length);
|
||||
this.update();
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
this.$choice.removeClass('disabled');
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
this.$choice.addClass('disabled');
|
||||
},
|
||||
|
||||
checkAll: function() {
|
||||
this.$selectItems.prop('checked', true);
|
||||
this.$selectGroups.prop('checked', true);
|
||||
this.$selectAll.prop('checked', true);
|
||||
this.update();
|
||||
this.options.onCheckAll();
|
||||
},
|
||||
|
||||
uncheckAll: function() {
|
||||
this.$selectItems.prop('checked', false);
|
||||
this.$selectGroups.prop('checked', false);
|
||||
this.$selectAll.prop('checked', false);
|
||||
this.update();
|
||||
this.options.onUncheckAll();
|
||||
},
|
||||
|
||||
focus: function() {
|
||||
this.$choice.focus();
|
||||
this.options.onFocus();
|
||||
},
|
||||
|
||||
blur: function() {
|
||||
this.$choice.blur();
|
||||
this.options.onBlur();
|
||||
},
|
||||
|
||||
refresh: function() {
|
||||
this.init();
|
||||
},
|
||||
|
||||
filter: function() {
|
||||
var that = this,
|
||||
text = $.trim(this.$searchInput.val()).toLowerCase();
|
||||
if (text.length === 0) {
|
||||
this.$selectItems.parent().show();
|
||||
this.$disableItems.parent().show();
|
||||
this.$selectGroups.parent().show();
|
||||
} else {
|
||||
this.$selectItems.each(function() {
|
||||
var $parent = $(this).parent();
|
||||
$parent[$parent.text().toLowerCase().indexOf(text) < 0 ? 'hide' : 'show']();
|
||||
});
|
||||
this.$disableItems.parent().hide();
|
||||
this.$selectGroups.each(function() {
|
||||
var $parent = $(this).parent();
|
||||
var group = $parent.attr('data-group'),
|
||||
$items = that.$selectItems.filter(':visible');
|
||||
$parent[$items.filter('[data-group="' + group + '"]').length === 0 ? 'hide' : 'show']();
|
||||
});
|
||||
|
||||
//Check if no matches found
|
||||
if (this.$selectItems.filter(':visible').length) {
|
||||
this.$selectAll.parent().show();
|
||||
this.$noResults.hide();
|
||||
} else {
|
||||
this.$selectAll.parent().hide();
|
||||
this.$noResults.show();
|
||||
}
|
||||
}
|
||||
this.updateOptGroupSelect();
|
||||
this.updateSelectAll();
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.multipleSelect = function() {
|
||||
var option = arguments[0],
|
||||
args = arguments,
|
||||
|
||||
value,
|
||||
allowedMethods = [
|
||||
'getSelects', 'setSelects',
|
||||
'enable', 'disable',
|
||||
'checkAll', 'uncheckAll',
|
||||
'focus', 'blur',
|
||||
'refresh'
|
||||
];
|
||||
|
||||
this.each(function() {
|
||||
var $this = $(this),
|
||||
data = $this.data('multipleSelect'),
|
||||
options = $.extend({}, $.fn.multipleSelect.defaults,
|
||||
$this.data(), typeof option === 'object' && option);
|
||||
|
||||
if (!data) {
|
||||
data = new MultipleSelect($this, options);
|
||||
$this.data('multipleSelect', data);
|
||||
}
|
||||
|
||||
if (typeof option === 'string') {
|
||||
if ($.inArray(option, allowedMethods) < 0) {
|
||||
throw "Unknown method: " + option;
|
||||
}
|
||||
value = data[option](args[1]);
|
||||
} else {
|
||||
data.init();
|
||||
}
|
||||
});
|
||||
|
||||
return value ? value : this;
|
||||
};
|
||||
|
||||
$.fn.multipleSelect.defaults = {
|
||||
name: '',
|
||||
isOpen: false,
|
||||
placeholder: '',
|
||||
selectAll: true,
|
||||
selectAllText: 'Select all',
|
||||
allSelected: 'All selected',
|
||||
minumimCountSelected: 3,
|
||||
countSelected: '# of % selected',
|
||||
multiple: false,
|
||||
multipleWidth: 80,
|
||||
single: false,
|
||||
filter: false,
|
||||
width: undefined,
|
||||
maxHeight: 250,
|
||||
container: null,
|
||||
position: 'bottom',
|
||||
keepOpen: false,
|
||||
|
||||
styler: function() {return false;},
|
||||
|
||||
onOpen: function() {return false;},
|
||||
onClose: function() {return false;},
|
||||
onCheckAll: function() {return false;},
|
||||
onUncheckAll: function() {return false;},
|
||||
onFocus: function() {return false;},
|
||||
onBlur: function() {return false;},
|
||||
onOptgroupClick: function() {return false;},
|
||||
onClick: function() {return false;}
|
||||
};
|
||||
})(jQuery);
|
||||
@ -0,0 +1,183 @@
|
||||
/**
|
||||
* @author zhixin wen <wenzhixin2010@gmail.com>
|
||||
*/
|
||||
|
||||
.ms-parent {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.ms-choice {
|
||||
display: block;
|
||||
height: 26px;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
border: 1px solid #aaa;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
line-height: 26px;
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.ms-choice.disabled {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border: 1px solid #ddd;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.ms-choice > span {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 20px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: block;
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
.ms-choice > span.placeholder {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.ms-choice > div {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 20px;
|
||||
height: 25px;
|
||||
background: url('multiple-select.png') right top no-repeat;
|
||||
}
|
||||
|
||||
.ms-choice > div.open {
|
||||
background: url('multiple-select.png') left top no-repeat;
|
||||
}
|
||||
|
||||
.ms-drop {
|
||||
overflow: hidden;
|
||||
display: none;
|
||||
margin-top: -1px;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
background: #fff;
|
||||
color: #000;
|
||||
border: 1px solid #aaa;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.ms-drop.bottom {
|
||||
top: 100%;
|
||||
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
-moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
.ms-drop.top {
|
||||
bottom: 100%;
|
||||
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
-moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
.ms-search {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
min-height: 26px;
|
||||
padding: 4px;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
.ms-search input {
|
||||
width: 100%;
|
||||
height: auto !important;
|
||||
min-height: 24px;
|
||||
padding: 0 20px 0 5px;
|
||||
margin: 0;
|
||||
outline: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
border: 1px solid #aaa;
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0;
|
||||
-webkit-box-shadow: none;
|
||||
-moz-box-shadow: none;
|
||||
box-shadow: none;
|
||||
background: #fff url('multiple-select.png') no-repeat 100% -22px;
|
||||
background: url('multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||
background: url('multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background: url('multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background: url('multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||
background: url('multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
|
||||
background: url('multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
|
||||
}
|
||||
|
||||
.ms-search, .ms-search input {
|
||||
-webkit-box-sizing: border-box;
|
||||
-khtml-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-ms-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.ms-drop ul {
|
||||
overflow: auto;
|
||||
margin: 0;
|
||||
padding: 5px 8px;
|
||||
}
|
||||
|
||||
.ms-drop ul > li {
|
||||
list-style: none;
|
||||
display: list-item;
|
||||
background-image: none;
|
||||
position: static;
|
||||
}
|
||||
|
||||
.ms-drop ul > li .disabled {
|
||||
opacity: .35;
|
||||
filter: Alpha(Opacity=35);
|
||||
}
|
||||
|
||||
.ms-drop ul > li.multiple {
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.ms-drop ul > li.group {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.ms-drop ul > li.multiple label {
|
||||
width: 100%;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.ms-drop ul > li label.optgroup {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.ms-drop input[type="checkbox"] {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.ms-drop .ms-no-results {
|
||||
display: none;
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "multiple-select",
|
||||
"version": "1.1.0",
|
||||
"title": "Multiple Select",
|
||||
"description": "Multiple select is a jQuery plugin to select multiple elements with checkboxes :).",
|
||||
"author": {
|
||||
"name": "zhixin wen",
|
||||
"email": "wenzhixin2010@gmail.com",
|
||||
"url": "http://wenzhixin.net.cn/"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"url": "http://opensource.org/licenses/MIT"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"jquery": ">=1.7"
|
||||
},
|
||||
"keywords": ["multiple.select", "select.list", "multiple.choose", "checkbox"],
|
||||
"homepage": "http://wenzhixin.net.cn/p/multiple-select/",
|
||||
"demo": "http://wenzhixin.net.cn/p/multiple-select/#examples",
|
||||
"bugs": {
|
||||
"url": "https://github.com/wenzhixin/multiple-select/issues"
|
||||
},
|
||||
"docs": "http://wenzhixin.net.cn/p/multiple-select/#documentation",
|
||||
"download": "https://github.com/wenzhixin/multiple-select/archive/master.zip"
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
@ -1,20 +0,0 @@
|
||||
Copyright (c) 2009 Michael Aufreiter, http://www.quasipartikel.at
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@ -1,31 +0,0 @@
|
||||
/* Multiselect
|
||||
----------------------------------*/
|
||||
|
||||
.ui-multiselect { border: solid 1px; font-size: 0.8em; }
|
||||
.ui-multiselect ul { -moz-user-select: none; }
|
||||
.ui-multiselect li { margin: 0; padding: 0; cursor: default; line-height: 20px; height: 20px; font-size: 11px; list-style: none; padding-right: 18px; overflow: hidden; }
|
||||
.ui-multiselect li a { color: #999; text-decoration: none; padding: 0; display: block; float: left; cursor: pointer;}
|
||||
.ui-multiselect li.ui-draggable-dragging { padding-left: 10px; }
|
||||
|
||||
.ui-multiselect div.selected { position: relative; padding: 0; margin: 0; border: 0; float:left; }
|
||||
.ui-multiselect ul.selected { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; position: relative; width: 100%; }
|
||||
|
||||
.ui-multiselect div.available { position: relative; padding: 0; margin: 0; border: 0; float:left; }
|
||||
.ui-multiselect ul.available { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; width: 100%; }
|
||||
.ui-multiselect ul.available li { padding-left: 10px; }
|
||||
|
||||
.ui-multiselect div.right-column { border-left: 1px solid; }
|
||||
|
||||
.ui-multiselect .ui-state-default { border: none; margin-bottom: 1px; position: relative; padding-left: 20px;}
|
||||
.ui-multiselect .ui-state-hover { border: none; }
|
||||
.ui-multiselect .ui-widget-header {border: none; font-size: 11px; margin-bottom: 1px;}
|
||||
|
||||
.ui-multiselect .add-all { float: right; padding: 7px;}
|
||||
.ui-multiselect .remove-all { float: right; padding: 7px;}
|
||||
.ui-multiselect .search { float: left; padding: 4px;}
|
||||
.ui-multiselect .count { float: left; padding: 7px;}
|
||||
|
||||
.ui-multiselect li span.ui-icon-arrowthick-2-n-s { position: absolute; left: 2px; }
|
||||
.ui-multiselect li a.action { position: absolute; right: 2px; top: 2px; }
|
||||
|
||||
.ui-multiselect input.search { height: 14px; padding: 1px; opacity: 0.5; margin: 4px; width: 100px; }
|
||||
@ -1,480 +0,0 @@
|
||||
/*
|
||||
* jQuery UI Multiselect
|
||||
*
|
||||
* Authors:
|
||||
* Michael Aufreiter (quasipartikel.at)
|
||||
* Yanick Rochon (yanick.rochon[at]gmail[dot]com)
|
||||
*
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* http://www.quasipartikel.at/multiselect/
|
||||
*
|
||||
*
|
||||
* Depends:
|
||||
* ui.core.js
|
||||
* ui.sortable.js
|
||||
*
|
||||
* Optional:
|
||||
* localization (http://plugins.jquery.com/project/localisation)
|
||||
* scrollTo (http://plugins.jquery.com/project/ScrollTo)
|
||||
*
|
||||
* Todo:
|
||||
* Make batch actions faster
|
||||
* Implement dynamic insertion through remote calls
|
||||
*/
|
||||
|
||||
|
||||
(function($) {
|
||||
|
||||
$.widget("ui.multiselect", {
|
||||
options: {
|
||||
sortable: true,
|
||||
dragToAdd: true,
|
||||
searchable: true,
|
||||
doubleClickable: true,
|
||||
animated: 'fast',
|
||||
show: 'slideDown',
|
||||
hide: 'slideUp',
|
||||
dividerLocation: 0.6,
|
||||
selectedContainerOnLeft: true,
|
||||
width: null,
|
||||
height: null,
|
||||
nodeComparator: function(node1,node2) {
|
||||
var text1 = node1.text(),
|
||||
text2 = node2.text();
|
||||
return text1 == text2 ? 0 : (text1 < text2 ? -1 : 1);
|
||||
},
|
||||
includeRemoveAll: true,
|
||||
includeAddAll: true,
|
||||
pressEnterKeyToAddAll: false
|
||||
},
|
||||
_create: function() {
|
||||
this.element.hide();
|
||||
this.id = this.element.attr("id");
|
||||
this.container = $('<div class="ui-multiselect ui-helper-clearfix ui-widget"></div>').insertAfter(this.element);
|
||||
this.count = 0; // number of currently selected options
|
||||
this.selectedContainer = $('<div class="selected"></div>');
|
||||
if (this.options.selectedContainerOnLeft) {
|
||||
this.selectedContainer.appendTo(this.container);
|
||||
this.availableContainer = $('<div class="available"></div>').appendTo(this.container);
|
||||
this.availableContainer.addClass('right-column');
|
||||
}
|
||||
else
|
||||
{
|
||||
this.availableContainer = $('<div class="available"></div>').appendTo(this.container);
|
||||
this.selectedContainer.appendTo(this.container);
|
||||
this.selectedContainer.addClass('right-column');
|
||||
}
|
||||
this.selectedActions = $('<div class="actions ui-widget-header ui-helper-clearfix"><span class="count">0 '+$.ui.multiselect.locale.itemsCount+'</span>'+(this.options.includeRemoveAll?'<a href="#" class="remove-all">'+$.ui.multiselect.locale.removeAll+'</a>':'<span class="remove-all"> </span>')+'</div>').appendTo(this.selectedContainer);
|
||||
this.availableActions = $('<div class="actions ui-widget-header ui-helper-clearfix"><input type="text" class="search empty ui-widget-content ui-corner-all"/>'+(this.options.includeAddAll?'<a href="#" class="add-all">'+$.ui.multiselect.locale.addAll+'</a>':'<span class="add-all"> </span>')+'</div>').appendTo(this.availableContainer);
|
||||
this.selectedList = $('<ul class="selected connected-list"><li class="ui-helper-hidden-accessible"></li></ul>').bind('selectstart', function(){return false;}).appendTo(this.selectedContainer);
|
||||
this.availableList = $('<ul class="available connected-list"><li class="ui-helper-hidden-accessible"></li></ul>').bind('selectstart', function(){return false;}).appendTo(this.availableContainer);
|
||||
|
||||
var that = this;
|
||||
|
||||
var width = this.options.width;
|
||||
if (!width) {
|
||||
width = this.element.width();
|
||||
}
|
||||
var height = this.options.height;
|
||||
if (!height) {
|
||||
height = this.element.height();
|
||||
}
|
||||
|
||||
// set dimensions
|
||||
this.container.width(width-2);
|
||||
if (this.options.selectedContainerOnLeft) {
|
||||
this.selectedContainer.width(Math.floor(width*this.options.dividerLocation)-1);
|
||||
this.availableContainer.width(Math.floor(width*(1-this.options.dividerLocation))-2);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.selectedContainer.width(Math.floor(width*this.options.dividerLocation)-2);
|
||||
this.availableContainer.width(Math.floor(width*(1-this.options.dividerLocation))-1);
|
||||
}
|
||||
|
||||
// fix list height to match <option> depending on their individual header's heights
|
||||
this.selectedList.height(Math.max(height-this.selectedActions.height(),1));
|
||||
this.availableList.height(Math.max(height-this.availableActions.height(),1));
|
||||
|
||||
if ( !this.options.animated ) {
|
||||
this.options.show = 'show';
|
||||
this.options.hide = 'hide';
|
||||
}
|
||||
|
||||
// init lists
|
||||
this._populateLists(this.element.find('option'));
|
||||
|
||||
// make selection sortable
|
||||
if (this.options.sortable) {
|
||||
this.selectedList.sortable({
|
||||
placeholder: 'ui-state-highlight',
|
||||
axis: 'y',
|
||||
update: function(event, ui) {
|
||||
// apply the new sort order to the original selectbox
|
||||
that.selectedList.find('li').each(function() {
|
||||
if ($(this).data('optionLink'))
|
||||
$(this).data('optionLink').remove().appendTo(that.element);
|
||||
});
|
||||
},
|
||||
beforeStop: function (event, ui) {
|
||||
// This lets us recognize which item was just added to
|
||||
// the list in receive, per the workaround for not being
|
||||
// able to reference the new element.
|
||||
ui.item.addClass('dropped');
|
||||
},
|
||||
receive: function(event, ui) {
|
||||
ui.item.data('optionLink').attr('selected', true);
|
||||
// increment count
|
||||
that.count += 1;
|
||||
that._updateCount();
|
||||
// workaround, because there's no way to reference
|
||||
// the new element, see http://dev.jqueryui.com/ticket/4303
|
||||
that.selectedList.children('.dropped').each(function() {
|
||||
$(this).removeClass('dropped');
|
||||
$(this).data('optionLink', ui.item.data('optionLink'));
|
||||
$(this).data('idx', ui.item.data('idx'));
|
||||
that._applyItemState($(this), true);
|
||||
});
|
||||
|
||||
// workaround according to http://dev.jqueryui.com/ticket/4088
|
||||
setTimeout(function() { ui.item.remove(); }, 1);
|
||||
},
|
||||
stop: function (event, ui) { that.element.change(); }
|
||||
});
|
||||
}
|
||||
|
||||
// set up livesearch
|
||||
if (this.options.searchable) {
|
||||
this._registerSearchEvents(this.availableContainer.find('input.search'));
|
||||
} else {
|
||||
$('.search').hide();
|
||||
}
|
||||
|
||||
// batch actions
|
||||
this.container.find(".remove-all").click(function() {
|
||||
that._populateLists(that.element.find('option').removeAttr('selected'));
|
||||
that.element.trigger('change');
|
||||
return false;
|
||||
});
|
||||
|
||||
this.container.find(".add-all").click(function() {
|
||||
var options = that.element.find('option').not(":selected");
|
||||
if (that.availableList.children('li:hidden').length > 1) {
|
||||
that.availableList.children('li').each(function(i) {
|
||||
if ($(this).is(":visible")) $(options[i-1]).attr('selected', 'selected');
|
||||
});
|
||||
} else {
|
||||
options.attr('selected', 'selected');
|
||||
}
|
||||
that._populateLists(that.element.find('option'));
|
||||
that.element.trigger('change');
|
||||
if (that.options.pressEnterKeyToAddAll) {
|
||||
//clear input after add all
|
||||
$('input.search').val("");
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
},
|
||||
destroy: function() {
|
||||
this.element.show();
|
||||
this.container.remove();
|
||||
|
||||
$.Widget.prototype.destroy.apply(this, arguments);
|
||||
},
|
||||
addOption: function(option) {
|
||||
// Append the option
|
||||
option = $(option);
|
||||
var select = this.element;
|
||||
select.append(option);
|
||||
|
||||
var item = this._getOptionNode(option).appendTo(option.attr('selected') ? this.selectedList : this.availableList).show();
|
||||
|
||||
if (option.attr('selected')) {
|
||||
this.count += 1;
|
||||
}
|
||||
this._applyItemState(item, option.attr('selected'));
|
||||
item.data('idx', this.count);
|
||||
|
||||
// update count
|
||||
this._updateCount();
|
||||
this._filter.apply(this.availableContainer.find('input.search'), [this.availableList]);
|
||||
},
|
||||
// Redisplay the lists of selected/available options.
|
||||
// Call this after you've selected/unselected some options programmatically.
|
||||
// GRIPE This is O(n) where n is the length of the list - seems like
|
||||
// there must be a smarter way of doing this, but I have not been able
|
||||
// to come up with one. I see no way to detect programmatic setting of
|
||||
// the option's selected property, and without that, it seems like we
|
||||
// can't have a general-case listener that does its thing every time an
|
||||
// option is selected.
|
||||
refresh: function() {
|
||||
// Redisplay our lists.
|
||||
this._populateLists(this.element.find('option'));
|
||||
},
|
||||
_populateLists: function(options) {
|
||||
this.selectedList.children('.ui-element').remove();
|
||||
this.availableList.children('.ui-element').remove();
|
||||
this.count = 0;
|
||||
|
||||
var that = this;
|
||||
var groups = $(this.element).find("optgroup").map(function(i) {
|
||||
return that._getOptionGroup($(this));
|
||||
});
|
||||
groups.appendTo(this.selectedList.add(this.availableList));
|
||||
|
||||
var items = $(options.map(function(i) {
|
||||
var item = that._getOptionNode(this).appendTo(that._getOptionList(this)).show();
|
||||
|
||||
if (this.selected) that.count += 1;
|
||||
that._applyItemState(item, this.selected);
|
||||
item.data('idx', i);
|
||||
return item[0];
|
||||
}));
|
||||
|
||||
// update count
|
||||
this._updateCount();
|
||||
that._filter.apply(this.availableContainer.find('input.search'), [that.availableList]);
|
||||
},
|
||||
_getOptionList: function(option) {
|
||||
var selected = option.selected;
|
||||
option = $(option);
|
||||
var $list = selected ? this.selectedList : this.availableList;
|
||||
var $group = option.closest("optgroup");
|
||||
if ($group.length === 0) {
|
||||
return $list;
|
||||
} else {
|
||||
var $groupList = $list.find("ul[title='" + $group.attr("label") + "']");
|
||||
if ($groupList.length === 0) {
|
||||
$groupList = $("<ul class='ui-state-default ui-element available' title='" + $group.attr("label") + "'>" + $group.attr("label") + "</ul>").appendTo($list);
|
||||
}
|
||||
$groupList.show();
|
||||
return $groupList;
|
||||
}
|
||||
},
|
||||
_getOptionGroup : function(optgroup) {
|
||||
var groupNode = $("<ul class='ui-state-default ui-element available' title='" + optgroup.attr("label") + "'>" + optgroup.attr("label") + "</ul>").hide();
|
||||
return groupNode[0];
|
||||
},
|
||||
_updateCount: function() {
|
||||
this.selectedContainer.find('span.count').text(this.count+" "+$.ui.multiselect.locale.itemsCount);
|
||||
},
|
||||
_getOptionNode: function(option) {
|
||||
option = $(option);
|
||||
var node = $('<li class="ui-state-default ui-element" title="'+option.text()+'"><span class="ui-icon"/>'+option.text()+'<a href="#" class="action"><span class="ui-corner-all ui-icon"/></a></li>').hide();
|
||||
node.data('optionLink', option);
|
||||
return node;
|
||||
},
|
||||
// clones an item with associated data
|
||||
// didn't find a smarter away around this
|
||||
_cloneWithData: function(clonee) {
|
||||
var clone = clonee.clone(false,false);
|
||||
clone.data('optionLink', clonee.data('optionLink'));
|
||||
clone.data('idx', clonee.data('idx'));
|
||||
return clone;
|
||||
},
|
||||
_setSelected: function(item, selected) {
|
||||
var temp = item.data('optionLink').attr('selected', selected);
|
||||
var parent = temp.parent();
|
||||
temp.detach().appendTo(parent);
|
||||
this.element.trigger('change');
|
||||
|
||||
if (selected) {
|
||||
var selectedItem = this._cloneWithData(item);
|
||||
item[this.options.hide](this.options.animated, function() {
|
||||
if (item.siblings().length === 0) {
|
||||
item.closest("ul[title]").hide();
|
||||
}
|
||||
$(this).remove();
|
||||
});
|
||||
// get group to add it to...
|
||||
var $list = this._getOptionList(selectedItem.data("optionLink")[0]);
|
||||
selectedItem.appendTo($list).hide()[this.options.show](this.options.animated);
|
||||
|
||||
this._applyItemState(selectedItem, true);
|
||||
return selectedItem;
|
||||
} else {
|
||||
|
||||
// look for successor based on initial option index
|
||||
var items = this.availableList.find('li'), comparator = this.options.nodeComparator;
|
||||
var succ = null, i = item.data('idx'), direction = comparator(item, $(items[i]));
|
||||
|
||||
// TODO: test needed for dynamic list populating
|
||||
if ( direction ) {
|
||||
while (i>=0 && i<items.length) {
|
||||
direction > 0 ? i++ : i--;
|
||||
if ( direction != comparator(item, $(items[i])) ) {
|
||||
// going up, go back one item down, otherwise leave as is
|
||||
succ = items[direction > 0 ? i : i+1];
|
||||
var group1 = item.closest("ul[title]"),
|
||||
group2 = $(succ).closest("ul[title]");
|
||||
if (group1.length !== 0 && group2.length !== 0) {
|
||||
if (group1.attr("title") !== group2.attr("title")) {
|
||||
succ = null;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
succ = items[i];
|
||||
}
|
||||
|
||||
var availableItem = this._cloneWithData(item);
|
||||
var $list = this._getOptionList(availableItem.data("optionLink")[0]);
|
||||
succ ? availableItem.insertBefore($(succ)) : availableItem.appendTo($list);
|
||||
item[this.options.hide](this.options.animated, function() {
|
||||
if (item.siblings().length === 0) {
|
||||
item.closest("ul[title]").hide();
|
||||
}
|
||||
$(this).remove();
|
||||
});
|
||||
availableItem.hide()[this.options.show](this.options.animated);
|
||||
|
||||
this._applyItemState(availableItem, false);
|
||||
return availableItem;
|
||||
}
|
||||
},
|
||||
_applyItemState: function(item, selected) {
|
||||
if (selected) {
|
||||
if (this.options.sortable)
|
||||
item.children('span').addClass('ui-icon-arrowthick-2-n-s').removeClass('ui-helper-hidden').addClass('ui-icon');
|
||||
else
|
||||
item.children('span').removeClass('ui-icon-arrowthick-2-n-s').addClass('ui-helper-hidden').removeClass('ui-icon');
|
||||
item.find('a.action span').addClass('ui-icon-minus').removeClass('ui-icon-plus');
|
||||
this._registerRemoveEvents(item.find('a.action'));
|
||||
|
||||
} else {
|
||||
item.children('span').removeClass('ui-icon-arrowthick-2-n-s').addClass('ui-helper-hidden').removeClass('ui-icon');
|
||||
item.find('a.action span').addClass('ui-icon-plus').removeClass('ui-icon-minus');
|
||||
this._registerAddEvents(item.find('a.action'));
|
||||
}
|
||||
|
||||
this._registerDoubleClickEvents(item);
|
||||
this._registerHoverEvents(item);
|
||||
},
|
||||
// taken from John Resig's liveUpdate script
|
||||
_filter: function(list) {
|
||||
var input = $(this);
|
||||
var rows = list.find('li'),
|
||||
cache = rows.map(function(){
|
||||
|
||||
return $(this).text().toLowerCase();
|
||||
});
|
||||
|
||||
var term = $.trim(input.val().toLowerCase()), scores = [];
|
||||
|
||||
if (!term) {
|
||||
rows.show();
|
||||
} else {
|
||||
rows.hide();
|
||||
|
||||
cache.each(function(i) {
|
||||
if (this.indexOf(term)>-1) { scores.push(i); }
|
||||
});
|
||||
|
||||
$.each(scores, function() {
|
||||
$(rows[this]).show();
|
||||
});
|
||||
}
|
||||
},
|
||||
_registerDoubleClickEvents: function(elements) {
|
||||
if (!this.options.doubleClickable) return;
|
||||
elements.dblclick(function() {
|
||||
elements.find('a.action').click();
|
||||
});
|
||||
},
|
||||
_registerHoverEvents: function(elements) {
|
||||
elements.removeClass('ui-state-hover');
|
||||
elements.mouseover(function() {
|
||||
$(this).addClass('ui-state-hover');
|
||||
});
|
||||
elements.mouseout(function() {
|
||||
$(this).removeClass('ui-state-hover');
|
||||
});
|
||||
},
|
||||
_registerAddEvents: function(elements) {
|
||||
var that = this;
|
||||
elements.click(function() {
|
||||
var item = that._setSelected($(this).parent(), true);
|
||||
that.count += 1;
|
||||
that._updateCount();
|
||||
|
||||
// Prevent extra clicks from triggering bogus add events, if a user
|
||||
// tries clicking during the removal process.
|
||||
$(this).unbind('click');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// make draggable
|
||||
if (this.options.sortable && this.options.dragToAdd) {
|
||||
elements.each(function() {
|
||||
$(this).parent().draggable({
|
||||
connectToSortable: that.selectedList,
|
||||
helper: function() {
|
||||
var selectedItem = that._cloneWithData($(this)).width($(this).width() - 50);
|
||||
selectedItem.width($(this).width());
|
||||
return selectedItem;
|
||||
},
|
||||
appendTo: that.container,
|
||||
containment: that.container,
|
||||
revert: 'invalid'
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
_registerRemoveEvents: function(elements) {
|
||||
var that = this;
|
||||
elements.click(function() {
|
||||
that._setSelected($(this).parent(), false);
|
||||
that.count -= 1;
|
||||
that._updateCount();
|
||||
|
||||
// Prevent extra clicks from triggering bogus remove events, if a
|
||||
// user tries clicking during the removal process.
|
||||
$(this).unbind('click');
|
||||
|
||||
return false;
|
||||
});
|
||||
},
|
||||
_registerSearchEvents: function(input) {
|
||||
var that = this;
|
||||
|
||||
input.focus(function() {
|
||||
$(this).addClass('ui-state-active');
|
||||
})
|
||||
.blur(function() {
|
||||
$(this).removeClass('ui-state-active');
|
||||
})
|
||||
.keypress(function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
if (that.options.pressEnterKeyToAddAll) {
|
||||
//on Enter, if a filter is present add all, then clear the input
|
||||
var str = $('input.search').val();
|
||||
if (str !== undefined && str !== null && str !== "") {
|
||||
$('a.add-all').click();
|
||||
$('input.search').val("");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
})
|
||||
.keyup(function() {
|
||||
that._filter.apply(this, [that.availableList]);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$.extend($.ui.multiselect, {
|
||||
locale: {
|
||||
addAll:'Add all',
|
||||
removeAll:'Remove all',
|
||||
itemsCount:'items selected'
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
})(jQuery);
|
||||
@ -154,7 +154,9 @@ if (empty($user->societe_id))
|
||||
! empty($conf->propal->enabled) && $user->rights->propale->lire,
|
||||
! empty($conf->commande->enabled) && $user->rights->commande->lire,
|
||||
! empty($conf->facture->enabled) && $user->rights->facture->lire,
|
||||
! empty($conf->contrat->enabled) && $user->rights->contrat->activer);
|
||||
! empty($conf->contrat->enabled) && $user->rights->contrat->activer,
|
||||
! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->commande->lire,
|
||||
! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture->lire);
|
||||
// Class file containing the method load_state_board for each line
|
||||
$includes=array(DOL_DOCUMENT_ROOT."/societe/class/client.class.php",
|
||||
DOL_DOCUMENT_ROOT."/comm/prospect/class/prospect.class.php",
|
||||
@ -165,7 +167,9 @@ if (empty($user->societe_id))
|
||||
DOL_DOCUMENT_ROOT."/comm/propal/class/propal.class.php",
|
||||
DOL_DOCUMENT_ROOT."/commande/class/commande.class.php",
|
||||
DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php",
|
||||
DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php");
|
||||
DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php",
|
||||
DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.commande.class.php",
|
||||
DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.facture.class.php");
|
||||
// Name class containing the method load_state_board for each line
|
||||
$classes=array('Client',
|
||||
'Prospect',
|
||||
@ -173,10 +177,12 @@ if (empty($user->societe_id))
|
||||
'Adherent',
|
||||
'Product',
|
||||
'Service',
|
||||
'Propal',
|
||||
'Commande',
|
||||
'Facture',
|
||||
'Contrat');
|
||||
'Propal',
|
||||
'Commande',
|
||||
'Facture',
|
||||
'Contrat',
|
||||
'CommandeFournisseur',
|
||||
'FactureFournisseur');
|
||||
// Cle array returned by the method load_state_board for each line
|
||||
$keys=array('customers',
|
||||
'prospects',
|
||||
@ -184,10 +190,12 @@ if (empty($user->societe_id))
|
||||
'members',
|
||||
'products',
|
||||
'services',
|
||||
'proposals',
|
||||
'orders',
|
||||
'invoices',
|
||||
'Contracts');
|
||||
'proposals',
|
||||
'orders',
|
||||
'invoices',
|
||||
'Contracts',
|
||||
'supplier_orders',
|
||||
'supplier_invoices');
|
||||
// Dashboard Icon lines
|
||||
$icons=array('company',
|
||||
'company',
|
||||
@ -195,10 +203,12 @@ if (empty($user->societe_id))
|
||||
'user',
|
||||
'product',
|
||||
'service',
|
||||
'propal',
|
||||
'order',
|
||||
'bill',
|
||||
'order');
|
||||
'propal',
|
||||
'order',
|
||||
'bill',
|
||||
'order',
|
||||
'order',
|
||||
'bill');
|
||||
// Translation keyword
|
||||
$titres=array("ThirdPartyCustomersStats",
|
||||
"ThirdPartyProspectsStats",
|
||||
@ -209,7 +219,9 @@ if (empty($user->societe_id))
|
||||
"CommercialProposalsShort",
|
||||
"CustomersOrders",
|
||||
"BillsCustomers",
|
||||
"Contracts");
|
||||
"Contracts",
|
||||
"SuppliersOrders",
|
||||
"SuppliersInvoices");
|
||||
// Dashboard Link lines
|
||||
$links=array(DOL_URL_ROOT.'/comm/list.php',
|
||||
DOL_URL_ROOT.'/comm/prospect/list.php',
|
||||
@ -220,7 +232,9 @@ if (empty($user->societe_id))
|
||||
DOL_URL_ROOT.'/comm/propal/list.php?mainmenu=commercial',
|
||||
DOL_URL_ROOT.'/commande/list.php?mainmenu=commercial',
|
||||
DOL_URL_ROOT.'/compta/facture/list.php?mainmenu=accountancy',
|
||||
DOL_URL_ROOT.'/contrat/list.php');
|
||||
DOL_URL_ROOT.'/contrat/list.php',
|
||||
DOL_URL_ROOT.'/fourn/commande/list.php',
|
||||
DOL_URL_ROOT.'/fourn/facture/list.php');
|
||||
// Translation lang files
|
||||
$langfile=array("companies",
|
||||
"prospects",
|
||||
|
||||
@ -60,11 +60,14 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_DELETE','Member deleted','Executed when a member is deleted','member',25);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_UNVALIDATE','Customer invoice unvalidated','Executed when a customer invoice status set back to draft','facture',10);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_VALIDATE','Intervention validated','Executed when a intervention is validated','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFYBILLED','Intervention set billed','Executed when a intervention is set to billed (when option FICHINTER_DISABLE_DETAILS is set)','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFY_BILLED','Intervention set billed','Executed when a intervention is set to billed (when option FICHINTER_CLASSIFY_BILLED is set)','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFY_UNBILLED','Intervention set unbilled','Executed when a intervention is set to unbilled (when option FICHINTER_CLASSIFY_BILLED is set)','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_REOPEN','Intervention opened','Executed when a intervention is re-opened','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_SENTBYMAIL','Intervention sent by mail','Executed when a intervention is sent by mail','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_CREATE','Project creation','Executed when a project is created','project',30);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_SIGNED','Customer proposal closed signed','Executed when a customer proposal is closed signed','propal',2);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLOSE_REFUSED','Customer proposal closed refused','Executed when a customer proposal is closed refused','propal',2);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_CREATE','Task created','Executed when a project task is created','project',35);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_MODIFY','Task modified','Executed when a project task is modified','project',36);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_DELETE','Task deleted','Executed when a project task is deleted','project',37);
|
||||
|
||||
@ -21,8 +21,11 @@
|
||||
|
||||
--insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_MODIFY','Intervention modified','Executed when a intervention is modified','ficheinter',19);
|
||||
--insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_DELETE','Intervention delete','Executed when a intervention is delete','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFYBILLED','Intervention set billed','Executed when a intervention is set to billed (when option FICHINTER_DISABLE_DETAILS is set)','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFY_BILLED','Intervention set billed','Executed when a intervention is set to billed (when option FICHINTER_CLASSIFY_BILLED is set)','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_CLASSIFY_UNBILLED','Intervention set unbilled','Executed when a intervention is set to unbilled (when option FICHINTER_CLASSIFY_BILLED is set)','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_SENTBYMAIL','Intervention sent by mail','Executed when a intervention is sent by mail','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_REOPEN','Intervention opened','Executed when a intervention is re-opened','ficheinter',19);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROPAL_CLASSIFY_BILLED','Customer proposal set billed','Executed when a customer proposal is set to billed','propal',2);
|
||||
|
||||
ALTER TABLE llx_notify ADD COLUMN fk_soc integer NULL after fk_action;
|
||||
|
||||
@ -46,8 +49,6 @@ ALTER TABLE llx_fichinter ADD COLUMN ref_ext varchar(255);
|
||||
-- Defined only to have specific list for countries that can't use generic list (like argentina that need type A or B)
|
||||
ALTER TABLE llx_c_typent ADD COLUMN fk_country integer NULL AFTER libelle;
|
||||
|
||||
INSERT INTO llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (29,'FICHINTER_CLASSIFY_BILLED','Classify intervention as billed','Executed when a intervention is classified as billed (when option FICHINTER_DISABLE_DETAILS is set)','ficheinter',19);
|
||||
|
||||
INSERT INTO llx_c_actioncomm (id, code, type, libelle, module, active, position) values (11,'AC_INT','system','Intervention on site',NULL, 1, 4);
|
||||
|
||||
ALTER TABLE llx_user ADD COLUMN fk_user_creat integer AFTER tms;
|
||||
@ -1026,6 +1027,7 @@ create table llx_c_email_templates
|
||||
tms timestamp,
|
||||
label varchar(255), -- Label of predefined email
|
||||
position smallint, -- Position
|
||||
active tinyint DEFAULT 1 NOT NULL,
|
||||
topic text, -- Predefined topic
|
||||
content text -- Predefined text
|
||||
) ENGINE=innodb;
|
||||
@ -1063,6 +1065,9 @@ ALTER TABLE llx_adherent CHANGE COLUMN civilite civility VARCHAR(6);
|
||||
ALTER TABLE llx_socpeople CHANGE COLUMN civilite civility VARCHAR(6);
|
||||
ALTER TABLE llx_user CHANGE COLUMN civilite civility VARCHAR(6);
|
||||
|
||||
ALTER TABLE llx_societe MODIFY COLUMN nom varchar(128);
|
||||
ALTER TABLE llx_adherent MODIFY COLUMN societe varchar(128);
|
||||
|
||||
ALTER TABLE llx_c_type_fees CHANGE COLUMN libelle label VARCHAR(30);
|
||||
ALTER TABLE llx_c_type_fees ADD COLUMN accountancy_code varchar(32) DEFAULT NULL AFTER label;
|
||||
|
||||
@ -1110,3 +1115,6 @@ DELETE FROM llx_menu WHERE module = 'boutique';
|
||||
-- Add option always editable on extrafield
|
||||
ALTER TABLE llx_extrafields ADD alwayseditable INTEGER DEFAULT 0 AFTER pos;
|
||||
|
||||
-- add supplier webservice fields
|
||||
ALTER TABLE llx_societe ADD webservices_url varchar(255) DEFAULT NULL;
|
||||
ALTER TABLE llx_societe ADD webservices_key varchar(128) DEFAULT NULL;
|
||||
|
||||
@ -37,7 +37,7 @@ create table llx_adherent
|
||||
pass varchar(50), -- password
|
||||
fk_adherent_type integer NOT NULL,
|
||||
morphy varchar(3) NOT NULL, -- personne morale / personne physique
|
||||
societe varchar(60), -- company name (should be same lenght than societe.name)
|
||||
societe varchar(128), -- company name (should be same lenght than societe.name)
|
||||
fk_soc integer NULL, -- Link to third party linked to member
|
||||
address text,
|
||||
zip varchar(30),
|
||||
|
||||
@ -30,6 +30,7 @@ create table llx_c_email_templates
|
||||
tms timestamp,
|
||||
label varchar(255), -- Label of predefined email
|
||||
position smallint, -- Position
|
||||
active tinyint DEFAULT 1 NOT NULL,
|
||||
topic text, -- Predefined topic
|
||||
content text -- Predefined text
|
||||
)ENGINE=innodb;
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
create table llx_societe
|
||||
(
|
||||
rowid integer AUTO_INCREMENT PRIMARY KEY,
|
||||
nom varchar(60), -- company reference name (should be smae length than adherent.societe)
|
||||
nom varchar(128), -- company reference name (should be same length than adherent.societe)
|
||||
entity integer DEFAULT 1 NOT NULL, -- multi company id
|
||||
|
||||
ref_ext varchar(128), -- reference into an external system (not used by dolibarr)
|
||||
@ -92,4 +92,6 @@ create table llx_societe
|
||||
logo varchar(255),
|
||||
canvas varchar(32), -- type of canvas if used (null by default)
|
||||
import_key varchar(14) -- import key
|
||||
webservices_url varchar(255), -- supplier webservice url
|
||||
webservices_key varchar(128), -- supplier webservice key
|
||||
)ENGINE=innodb;
|
||||
|
||||
@ -514,16 +514,16 @@ Module5000Name=Multi-company
|
||||
Module5000Desc=Allows you to manage multiple companies
|
||||
Module6000Name=Workflow
|
||||
Module6000Desc=Workflow management
|
||||
Module20000Name=Holidays
|
||||
Module20000Desc=Declare and follow employees holidays
|
||||
Module20000Name=Leave Requests management
|
||||
Module20000Desc=Declare and follow employees leaves requests
|
||||
Module39000Name=Product batch
|
||||
Module39000Desc=Batch number, eat-by and sell-by date management on products
|
||||
Module50000Name=PayBox
|
||||
Module50000Desc=Module to offer an online payment page by credit card with PayBox
|
||||
Module50100Name=Point of sales
|
||||
Module50100Desc=Point of sales module
|
||||
Module50200Name= Paypal
|
||||
Module50200Desc= Module to offer an online payment page by credit card with Paypal
|
||||
Module50200Name=Paypal
|
||||
Module50200Desc=Module to offer an online payment page by credit card with Paypal
|
||||
Module50400Name=Accounting (advanced)
|
||||
Module50400Desc=Accounting management (double parties)
|
||||
Module54000Name=PrintIPP
|
||||
@ -1147,6 +1147,7 @@ HideTreadedOrders=Hide the treated or cancelled orders in the list
|
||||
ValidOrderAfterPropalClosed=To validate the order after proposal closer, makes it possible not to step by the provisional order
|
||||
FreeLegalTextOnOrders=Free text on orders
|
||||
WatermarkOnDraftOrders=Watermark on draft orders (none if empty)
|
||||
ShippableOrderIconInList=Add an icon in Orders list which indicate if order is shippable
|
||||
##### Clicktodial #####
|
||||
ClickToDialSetup=Click To Dial module setup
|
||||
ClickToDialUrlDesc=Url called when a click on phone picto is done. In URL, you can use tags<br><b>__PHONETO__</b> that will be replaced with the phone number of person to call<br><b>__PHONEFROM__</b> that will be replaced with phone number of calling person (yours)<br><b>__LOGIN__</b> that will be replaced with your clicktodial login (defined on your user card)<br><b>__PASS__</b> that will be replaced with your clicktodial password (defined on your user card).
|
||||
|
||||
@ -51,7 +51,6 @@ OrderApprovedInDolibarr=Order %s approved
|
||||
OrderRefusedInDolibarr=Order %s refused
|
||||
OrderBackToDraftInDolibarr=Order %s go back to draft status
|
||||
OrderCanceledInDolibarr=Order %s canceled
|
||||
InterventionValidatedInDolibarr=Intervention %s validated
|
||||
ProposalSentByEMail=Commercial proposal %s sent by EMail
|
||||
OrderSentByEMail=Customer order %s sent by EMail
|
||||
InvoiceSentByEMail=Customer invoice %s sent by EMail
|
||||
@ -59,8 +58,6 @@ SupplierOrderSentByEMail=Supplier order %s sent by EMail
|
||||
SupplierInvoiceSentByEMail=Supplier invoice %s sent by EMail
|
||||
ShippingSentByEMail=Shipping %s sent by EMail
|
||||
ShippingValidated= Shipping %s validated
|
||||
InterventionSentByEMail=Intervention %s sent by EMail
|
||||
InterventionClassifiedBilled=Intervention %s classified as Billed
|
||||
NewCompanyToDolibarr= Third party created
|
||||
DateActionPlannedStart= Planned start date
|
||||
DateActionPlannedEnd= Planned end date
|
||||
@ -70,9 +67,9 @@ DateActionStart= Start date
|
||||
DateActionEnd= End date
|
||||
AgendaUrlOptions1=You can also add following parameters to filter output:
|
||||
AgendaUrlOptions2=<b>login=%s</b> to restrict output to actions created by, assigned to or done by user <b>%s</b>.
|
||||
AgendaUrlOptions3=<b>logina=%s</b> to restrict output to actions created by user <b>%s</b>.
|
||||
AgendaUrlOptions3=<b>logina=%s</b> to restrict output to actions owned by a user <b>%s</b>.
|
||||
AgendaUrlOptions4=<b>logint=%s</b> to restrict output to actions assigned to user <b>%s</b>.
|
||||
AgendaUrlOptions5=<b>logind=%s</b> to restrict output to actions done by user <b>%s</b>.
|
||||
AgendaUrlOptionsProject=<b>project=PROJECT_ID</b> to restrict output to actions associated to project <b>PROJECT_ID</b>.
|
||||
AgendaShowBirthdayEvents=Show birthday's contacts
|
||||
AgendaHideBirthdayEvents=Hide birthday's contacts
|
||||
Busy=Busy
|
||||
@ -90,4 +87,4 @@ ExtSiteNoLabel=No Description
|
||||
WorkingTimeRange=Working time range
|
||||
WorkingDaysRange=Working days range
|
||||
AddEvent=Create event
|
||||
MyAvailability=My availability
|
||||
MyAvailability=My availability
|
||||
|
||||
@ -24,3 +24,5 @@ Deliverer=Deliverer :
|
||||
Sender=Sender
|
||||
Recipient=Recipient
|
||||
ErrorStockIsNotEnough=There's not enough stock
|
||||
Shippable=Shippable
|
||||
NonShippable=Not Shippable
|
||||
|
||||
@ -52,16 +52,16 @@ UpdateButtonCP=Update
|
||||
CantUpdate=You cannot update this leave request.
|
||||
NoDateDebut=You must select a start date.
|
||||
NoDateFin=You must select an end date.
|
||||
ErrorDureeCP=Your request for holidays does not contain working day.
|
||||
TitleValidCP=Approve the request holidays
|
||||
ErrorDureeCP=Your leave request does not contain working day.
|
||||
TitleValidCP=Approve the leave request
|
||||
ConfirmValidCP=Are you sure you want to approve the leave request?
|
||||
DateValidCP=Date approved
|
||||
TitleToValidCP=Send leave request
|
||||
ConfirmToValidCP=Are you sure you want to send the leave request?
|
||||
TitleRefuseCP=Refuse the request holidays
|
||||
TitleRefuseCP=Refuse the leave request
|
||||
ConfirmRefuseCP=Are you sure you want to refuse the leave request?
|
||||
NoMotifRefuseCP=You must choose a reason for refusing the request.
|
||||
TitleCancelCP=Cancel the request holidays
|
||||
TitleCancelCP=Cancel the leave request
|
||||
ConfirmCancelCP=Are you sure you want to cancel the leave request?
|
||||
DetailRefusCP=Reason for refusal
|
||||
DateRefusCP=Date of refusal
|
||||
@ -78,7 +78,7 @@ ActionByCP=Performed by
|
||||
UserUpdateCP=For the user
|
||||
PrevSoldeCP=Previous Balance
|
||||
NewSoldeCP=New Balance
|
||||
alreadyCPexist=A request for holidays has already been done on this period.
|
||||
alreadyCPexist=A leave request has already been done on this period.
|
||||
UserName=Name
|
||||
Employee=Employee
|
||||
FirstDayOfHoliday=First day of vacation
|
||||
@ -88,25 +88,25 @@ ManualUpdate=Manual update
|
||||
HolidaysCancelation=Leave request cancelation
|
||||
|
||||
## Configuration du Module ##
|
||||
ConfCP=Configuration of holidays module
|
||||
ConfCP=Configuration of leave request module
|
||||
DescOptionCP=Description of the option
|
||||
ValueOptionCP=Value
|
||||
GroupToValidateCP=Group with the ability to approve vacation
|
||||
GroupToValidateCP=Group with the ability to approve leave requests
|
||||
ConfirmConfigCP=Validate the configuration
|
||||
LastUpdateCP=Last automatic update of vacation
|
||||
LastUpdateCP=Last automatic update of leaves allocation
|
||||
UpdateConfCPOK=Updated successfully.
|
||||
ErrorUpdateConfCP=An error occurred during the update, please try again.
|
||||
AddCPforUsers=Please add the balance of holidays of users by <a href="../define_holiday.php" style="font-weight: normal; color: red; text-decoration: underline;">clicking here</a>.
|
||||
DelayForSubmitCP=Deadline to apply for holidays
|
||||
AlertapprobatortorDelayCP=Prevent the approbator if the holiday request does not match the deadline
|
||||
AddCPforUsers=Please add the balance of leaves allocation of users by <a href="../define_holiday.php" style="font-weight: normal; color: red; text-decoration: underline;">clicking here</a>.
|
||||
DelayForSubmitCP=Deadline to make a leave requests
|
||||
AlertapprobatortorDelayCP=Prevent the approbator if the leave request does not match the deadline
|
||||
AlertValidatorDelayCP=Préevent the approbator if the leave request exceed delay
|
||||
AlertValidorSoldeCP=Prevent the approbator if the leave request exceed the balance
|
||||
nbUserCP=Number of users supported in the module Leaves
|
||||
nbHolidayDeductedCP=Number of holidays to be deducted per day of vacation taken
|
||||
nbHolidayEveryMonthCP=Number of vacation days added every month
|
||||
nbHolidayDeductedCP=Number of leave days to be deducted per day of vacation taken
|
||||
nbHolidayEveryMonthCP=Number of leave days added every month
|
||||
Module27130Name= Management of leave requests
|
||||
Module27130Desc= Management of leave requests
|
||||
TitleOptionMainCP=Main settings of Leave request
|
||||
TitleOptionMainCP=Main settings of leave request
|
||||
TitleOptionEventCP=Settings of leave requets for events
|
||||
ValidEventCP=Validate
|
||||
UpdateEventCP=Update events
|
||||
|
||||
@ -31,6 +31,14 @@ RelatedInterventions=Related interventions
|
||||
ShowIntervention=Show intervention
|
||||
SendInterventionRef=Submission of intervention %s
|
||||
SendInterventionByMail=Send intervention by Email
|
||||
InterventionCreatedInDolibarr=Intervention %s created
|
||||
InterventionValidatedInDolibarr=Intervention %s validated
|
||||
InterventionModifiedInDolibarr=Intervention %s modified
|
||||
InterventionClassifiedBilledInDolibarr=Intervention %s set as billed
|
||||
InterventionClassifiedUnbilledInDolibarr=Intervention %s set as unbilled
|
||||
InterventionSentByEMail=Intervention %s sent by EMail
|
||||
InterventionDeletedInDolibarr=Intervention %s deleted
|
||||
SearchAnIntervention=Search an intervention
|
||||
##### Types de contacts #####
|
||||
TypeContact_fichinter_internal_INTERREPFOLL=Representative following-up intervention
|
||||
TypeContact_fichinter_internal_INTERVENING=Intervening
|
||||
|
||||
@ -203,25 +203,26 @@ ForgetIfNothing=If you didn't request this change, just forget this email. Your
|
||||
|
||||
##### Calendar common #####
|
||||
AddCalendarEntry=Add entry in calendar %s
|
||||
NewCompanyToDolibarr=Company %s added into Dolibarr
|
||||
ContractValidatedInDolibarr=Contract %s validated in Dolibarr
|
||||
ContractCanceledInDolibarr=Contract %s canceled in Dolibarr
|
||||
ContractClosedInDolibarr=Contract %s closed in Dolibarr
|
||||
PropalClosedSignedInDolibarr=Proposal %s signed in Dolibarr
|
||||
PropalClosedRefusedInDolibarr=Proposal %s refused in Dolibarr
|
||||
PropalValidatedInDolibarr=Proposal %s validated in Dolibarr
|
||||
InvoiceValidatedInDolibarr=Invoice %s validated in Dolibarr
|
||||
InvoicePaidInDolibarr=Invoice %s changed to paid in Dolibarr
|
||||
InvoiceCanceledInDolibarr=Invoice %s canceled in Dolibarr
|
||||
PaymentDoneInDolibarr=Payment %s done in Dolibarr
|
||||
CustomerPaymentDoneInDolibarr=Customer payment %s done in Dolibarr
|
||||
SupplierPaymentDoneInDolibarr=Supplier payment %s done in Dolibarr
|
||||
MemberValidatedInDolibarr=Member %s validated in Dolibarr
|
||||
MemberResiliatedInDolibarr=Member %s resiliated in Dolibarr
|
||||
MemberDeletedInDolibarr=Member %s deleted from Dolibarr
|
||||
MemberSubscriptionAddedInDolibarr=Subscription for member %s added in Dolibarr
|
||||
ShipmentValidatedInDolibarr=Shipment %s validated in Dolibarr
|
||||
ShipmentDeletedInDolibarr=Shipment %s deleted from Dolibarr
|
||||
NewCompanyToDolibarr=Company %s added
|
||||
ContractValidatedInDolibarr=Contract %s validated
|
||||
ContractCanceledInDolibarr=Contract %s canceled
|
||||
ContractClosedInDolibarr=Contract %s closed
|
||||
PropalClosedSignedInDolibarr=Proposal %s signed
|
||||
PropalClosedRefusedInDolibarr=Proposal %s refused
|
||||
PropalValidatedInDolibarr=Proposal %s validated
|
||||
PropalClassifiedBilledInDolibarr=Proposal %s classified billed
|
||||
InvoiceValidatedInDolibarr=Invoice %s validated
|
||||
InvoicePaidInDolibarr=Invoice %s changed to paid
|
||||
InvoiceCanceledInDolibarr=Invoice %s canceled
|
||||
PaymentDoneInDolibarr=Payment %s done
|
||||
CustomerPaymentDoneInDolibarr=Customer payment %s done
|
||||
SupplierPaymentDoneInDolibarr=Supplier payment %s done
|
||||
MemberValidatedInDolibarr=Member %s validated
|
||||
MemberResiliatedInDolibarr=Member %s resiliated
|
||||
MemberDeletedInDolibarr=Member %s deleted
|
||||
MemberSubscriptionAddedInDolibarr=Subscription for member %s added
|
||||
ShipmentValidatedInDolibarr=Shipment %s validated
|
||||
ShipmentDeletedInDolibarr=Shipment %s deleted
|
||||
##### Export #####
|
||||
Export=Export
|
||||
ExportsArea=Exports area
|
||||
|
||||
@ -73,6 +73,7 @@ AgendaUrlOptions2=<b>login=%s</b> pour limiter l'export aux actions créées, af
|
||||
AgendaUrlOptions3=<b>logina=%s</b> pour limiter l'export aux actions créées par l'utilisateur <b>%s</b>.
|
||||
AgendaUrlOptions4=<b>logint=%s</b> pour limiter l'export aux actions affectées à l'utilisateur <b>%s</b>.
|
||||
AgendaUrlOptions5=<b>logind=%s</b> pour limiter l'export aux actions réalisées par l'utilisateur <b>%s</b>.
|
||||
AgendaUrlOptionsProject=<b>project=PROJECT_ID</b> pour limiter l'export aux actions associées au projet dont l'identifiant est <b>PROJECT_ID</b>.
|
||||
AgendaShowBirthdayEvents=Afficher l'anniversaire des contacts
|
||||
AgendaHideBirthdayEvents=Cacher l'anniversaire des contacts
|
||||
Busy=Occupé
|
||||
|
||||
@ -460,7 +460,7 @@ if (! defined('NOLOGIN'))
|
||||
$datesecond=dol_stringtotime($_POST["dst_second"]);
|
||||
if ($datenow >= $datefirst && $datenow < $datesecond) $dol_dst=1;
|
||||
}
|
||||
//print $datefirst.'-'.$datesecond.'-'.$datenow; exit;
|
||||
//print $datefirst.'-'.$datesecond.'-'.$datenow.'-'.$dol_tz.'-'.$dol_tzstring.'-'.$dol_dst; exit;
|
||||
}
|
||||
|
||||
if (! $login)
|
||||
@ -621,6 +621,8 @@ if (! defined('NOLOGIN'))
|
||||
|
||||
$user->update_last_login_date();
|
||||
|
||||
$user->trigger_mesg = 'TZ='.$_SESSION["dol_tz"].';TZString='.$_SESSION["dol_tz_string"].';Screen='.$_SESSION["dol_screenwidth"].'x'.$_SESSION["dol_screenheight"];
|
||||
|
||||
// TODO We should use a hook here, not a trigger
|
||||
// Call triggers
|
||||
include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
|
||||
@ -1013,10 +1015,14 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
|
||||
//print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/datatables/extras/ColVis/css/ColVisAlt.css'.($ext?'?'.$ext:'').'" />'."\n";
|
||||
print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/datatables/extras/TableTools/css/TableTools.css'.($ext?'?'.$ext:'').'" />'."\n";
|
||||
}
|
||||
if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT'))) // jQuery multiselect
|
||||
if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && $conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiselect') || (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT') == 'multiselect')) // jQuery multiselect
|
||||
{
|
||||
print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiselect/css/ui.multiselect.css'.($ext?'?'.$ext:'').'" />'."\n";
|
||||
}
|
||||
if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && $conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiple-select') || (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT') == 'multiple-select')) // jQuery multiple-select
|
||||
{
|
||||
print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiple-select/multiple-select.css'.($ext?'?'.$ext:'').'" />'."\n";
|
||||
}
|
||||
// jQuery Timepicker
|
||||
if (! empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined('REQUIRE_JQUERY_TIMEPICKER'))
|
||||
{
|
||||
@ -1176,11 +1182,6 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
|
||||
print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/datatables/extras/ColVis/js/ColVis.min.js'.($ext?'?'.$ext:'').'"></script>'."\n";
|
||||
print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/datatables/extras/TableTools/js/TableTools.min.js'.($ext?'?'.$ext:'').'"></script>'."\n";
|
||||
}
|
||||
// jQuery Multiselect
|
||||
if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT')))
|
||||
{
|
||||
print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiselect/js/ui.multiselect.js'.($ext?'?'.$ext:'').'"></script>'."\n";
|
||||
}
|
||||
// jQuery Timepicker
|
||||
if (! empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined('REQUIRE_JQUERY_TIMEPICKER'))
|
||||
{
|
||||
|
||||
@ -1420,7 +1420,7 @@ else
|
||||
// Status (to sell)
|
||||
print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Sell").')</td><td colspan="2">';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_productonoff($object->id, 'status');
|
||||
print ajax_object_onoff($object, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell');
|
||||
} else {
|
||||
print $object->getLibStatut(2,0);
|
||||
}
|
||||
@ -1429,18 +1429,22 @@ else
|
||||
// Status (to buy)
|
||||
print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Buy").')</td><td colspan="2">';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_productonoff($object->id, 'status_buy');
|
||||
print ajax_object_onoff($object, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy');
|
||||
} else {
|
||||
print $object->getLibStatut(2,1);
|
||||
}
|
||||
print '</td></tr>';
|
||||
|
||||
// Batch number management (to batch)
|
||||
if ($conf->productbatch->enabled) {
|
||||
print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Lot").')</td><td colspan="2">';
|
||||
print $object->getLibStatut(2,2);
|
||||
print '</td></tr>';
|
||||
}
|
||||
// Batch number management (to batch)
|
||||
if ($conf->productbatch->enabled) {
|
||||
print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Lot").')</td><td colspan="2">';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_object_onoff($object, 'status_batch', 'tobatch', 'ProductStatusOnBatch', 'ProductStatusNotOnBatch');
|
||||
} else {
|
||||
print $object->getLibStatut(2,2);
|
||||
}
|
||||
print '</td></tr>';
|
||||
}
|
||||
|
||||
// Description
|
||||
print '<tr><td valign="top">'.$langs->trans("Description").'</td><td colspan="2">'.(dol_textishtml($object->description)?$object->description:dol_nl2br($object->description,1,true)).'</td></tr>';
|
||||
|
||||
@ -507,11 +507,25 @@ else
|
||||
}
|
||||
}
|
||||
|
||||
// Status (to buy)
|
||||
print '<td align="center" class="nowrap">'.$product_static->LibStatut($objp->tosell,5,0).'</td>';
|
||||
|
||||
$product_static->status_buy = $objp->tobuy;
|
||||
$product_static->status = $objp->tosell;
|
||||
// Status (to sell)
|
||||
print '<td align="center" class="nowrap">'.$product_static->LibStatut($objp->tobuy,5,1).'</td>';
|
||||
print '<td align="right" nowrap="nowrap">';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_object_onoff($product_static, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell');
|
||||
} else {
|
||||
print $product_static->LibStatut($objp->tosell,5,0);
|
||||
}
|
||||
print '</td>';
|
||||
|
||||
// Status (to buy)
|
||||
print '<td align="right" nowrap="nowrap">';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_object_onoff($product_static, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy');
|
||||
} else {
|
||||
print $product_static->LibStatut($objp->tobuy,5,1);
|
||||
}
|
||||
print '</td>';
|
||||
|
||||
print '<td> </td>';
|
||||
|
||||
|
||||
@ -279,7 +279,7 @@ if ($id > 0 || $ref)
|
||||
// Status (to sell)
|
||||
print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Sell").')</td><td>';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_productonoff($product->id, 'status');
|
||||
print ajax_object_onoff($product, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell');
|
||||
} else {
|
||||
print $product->getLibStatut(2,0);
|
||||
}
|
||||
@ -288,7 +288,7 @@ if ($id > 0 || $ref)
|
||||
// Status (to buy)
|
||||
print '<tr><td>'.$langs->trans("Status").' ('.$langs->trans("Buy").')</td><td colspan="2">';
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer) {
|
||||
print ajax_productonoff($product->id, 'status_buy');
|
||||
print ajax_object_onoff($product, 'status_buy', 'tobuy', 'ProductStatusOnBuy', 'ProductStatusNotOnBuy');
|
||||
} else {
|
||||
print $product->getLibStatut(2,1);
|
||||
}
|
||||
|
||||
@ -65,6 +65,7 @@ if (! empty($_GET["year"])) $filters['year']=$_GET["year"];
|
||||
if (! empty($_GET["id"])) $filters['id']=$_GET["id"];
|
||||
if (! empty($_GET["idfrom"])) $filters['idfrom']=$_GET["idfrom"];
|
||||
if (! empty($_GET["idto"])) $filters['idto']=$_GET["idto"];
|
||||
if (! empty($_GET["project"])) $filters['project']=$_GET["project"];
|
||||
if (! empty($_GET["login"])) $filters['login']=$_GET["login"];
|
||||
if (! empty($_GET["logina"])) $filters['logina']=$_GET["logina"];
|
||||
if (! empty($_GET["logint"])) $filters['logint']=$_GET["logint"];
|
||||
@ -107,6 +108,7 @@ foreach ($filters as $key => $value)
|
||||
if ($key == 'id') $filename.='-id'.$value;
|
||||
if ($key == 'idfrom') $filename.='-idfrom'.$value;
|
||||
if ($key == 'idto') $filename.='-idto'.$value;
|
||||
if ($key == 'project') $filename.='-project'.$value;
|
||||
if ($key == 'login') $filename.='-login'.$value;
|
||||
if ($key == 'logina') $filename.='-logina'.$value; // Author
|
||||
if ($key == 'logind') $filename.='-logind'.$value; // Affected to
|
||||
|
||||
@ -334,6 +334,18 @@ class Societe extends CommonObject
|
||||
*/
|
||||
var $import_key;
|
||||
|
||||
/**
|
||||
* Supplier WebServices URL
|
||||
* @var string
|
||||
*/
|
||||
var $webservices_url;
|
||||
|
||||
/**
|
||||
* Supplier WebServices Key
|
||||
* @var string
|
||||
*/
|
||||
var $webservices_key;
|
||||
|
||||
var $logo;
|
||||
var $logo_small;
|
||||
var $logo_mini;
|
||||
@ -715,6 +727,10 @@ class Societe extends CommonObject
|
||||
$supplier=true;
|
||||
}
|
||||
|
||||
//Web services
|
||||
$this->webservices_url = $this->webservices_url?clean_url($this->webservices_url,0):'';
|
||||
$this->webservices_key = trim($this->webservices_key);
|
||||
|
||||
$this->db->begin();
|
||||
|
||||
// Check name is required and codes are ok or unique.
|
||||
@ -795,6 +811,9 @@ class Societe extends CommonObject
|
||||
$sql .= ",default_lang = ".(! empty($this->default_lang)?"'".$this->default_lang."'":"null");
|
||||
$sql .= ",logo = ".(! empty($this->logo)?"'".$this->logo."'":"null");
|
||||
|
||||
$sql .= ",webservices_url = ".(! empty($this->webservices_url)?"'".$this->db->escape($this->webservices_url)."'":"null");
|
||||
$sql .= ",webservices_key = ".(! empty($this->webservices_key)?"'".$this->db->escape($this->webservices_key)."'":"null");
|
||||
|
||||
if ($customer)
|
||||
{
|
||||
$sql .= ", code_client = ".(! empty($this->code_client)?"'".$this->db->escape($this->code_client)."'":"null");
|
||||
@ -951,6 +970,7 @@ class Societe extends CommonObject
|
||||
$sql .= ', s.fk_typent as typent_id';
|
||||
$sql .= ', s.fk_effectif as effectif_id';
|
||||
$sql .= ', s.fk_forme_juridique as forme_juridique_code';
|
||||
$sql .= ', s.webservices_url, s.webservices_key';
|
||||
$sql .= ', s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur, s.parent, s.barcode';
|
||||
$sql .= ', s.fk_departement, s.fk_pays as country_id, s.fk_stcomm, s.remise_client, s.mode_reglement, s.cond_reglement, s.tva_assuj';
|
||||
$sql .= ', s.mode_reglement_supplier, s.cond_reglement_supplier, s.localtax1_assuj, s.localtax1_value, s.localtax2_assuj, s.localtax2_value, s.fk_prospectlevel, s.default_lang, s.logo';
|
||||
@ -1086,6 +1106,9 @@ class Societe extends CommonObject
|
||||
$this->default_lang = $obj->default_lang;
|
||||
$this->logo = $obj->logo;
|
||||
|
||||
$this->webservices_url = $obj->webservices_url;
|
||||
$this->webservices_key = $obj->webservices_key;
|
||||
|
||||
$this->outstanding_limit = $obj->outstanding_limit;
|
||||
|
||||
// multiprix
|
||||
@ -1316,6 +1339,19 @@ class Societe extends CommonObject
|
||||
}
|
||||
}
|
||||
|
||||
// Remove associated users
|
||||
if (! $error)
|
||||
{
|
||||
$sql = "DELETE FROM ".MAIN_DB_PREFIX."societe_commerciaux";
|
||||
$sql.= " WHERE fk_soc = " . $id;
|
||||
dol_syslog(get_class($this)."::Delete", LOG_DEBUG);
|
||||
if (! $this->db->query($sql))
|
||||
{
|
||||
$error++;
|
||||
$this->error = $this->db->lasterror();
|
||||
}
|
||||
}
|
||||
|
||||
// Removed extrafields
|
||||
if ((! $error) && (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED))) // For avoid conflicts if trigger used
|
||||
{
|
||||
|
||||
@ -119,7 +119,7 @@ if (empty($reshook))
|
||||
$res=$object->setValueFrom('localtax2_value', $value);
|
||||
}
|
||||
|
||||
// Add new third party
|
||||
// Add new or update third party
|
||||
if ((! GETPOST('getcustomercode') && ! GETPOST('getsuppliercode'))
|
||||
&& ($action == 'add' || $action == 'update') && $user->rights->societe->creer)
|
||||
{
|
||||
@ -189,6 +189,10 @@ if (empty($reshook))
|
||||
$object->commercial_id = GETPOST('commercial_id', 'int');
|
||||
$object->default_lang = GETPOST('default_lang');
|
||||
|
||||
// Webservices url/key
|
||||
$object->webservices_url = GETPOST('webservices_url', 'custom', 0, FILTER_SANITIZE_URL);
|
||||
$object->webservices_key = GETPOST('webservices_key', 'san_alpha');
|
||||
|
||||
// Fill array 'array_options' with data from add form
|
||||
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
||||
|
||||
@ -217,6 +221,18 @@ if (empty($reshook))
|
||||
$error++; $errors[] = $langs->trans("ErrorSupplierModuleNotEnabled");
|
||||
$action = ($action=='add'?'create':'edit');
|
||||
}
|
||||
if (! empty($object->webservices_url)) {
|
||||
//Check if has transport, without any the soap client will give error
|
||||
if (strpos($object->webservices_url, "http") === false)
|
||||
{
|
||||
$object->webservices_url = "http://".$object->webservices_url;
|
||||
}
|
||||
if (! isValidUrl($object->webservices_url)) {
|
||||
$langs->load("errors");
|
||||
$error++; $errors[] = $langs->trans("ErrorBadUrl",$object->webservices_url);
|
||||
$action = ($action=='add'?'create':'edit');
|
||||
}
|
||||
}
|
||||
|
||||
// We set country_id, country_code and country for the selected country
|
||||
$object->country_id=GETPOST('country_id')!=''?GETPOST('country_id'):$mysoc->country_id;
|
||||
@ -765,7 +781,7 @@ else
|
||||
print '<div class="hideonsmartphone float">';
|
||||
print $langs->trans("ThirdPartyType").': ';
|
||||
print '</div>';
|
||||
print '<input type="radio" id="1radiocompany" class="flat" name="private" value="0"'.($private?'':' checked="checked"').'>';
|
||||
print '<input type="radio" id="radiocompany" class="flat" name="private" value="0"'.($private?'':' checked="checked"').'>';
|
||||
print '<label for="radiocompany">';
|
||||
print ' ';
|
||||
print $langs->trans("Company/Fundation");
|
||||
@ -805,7 +821,7 @@ else
|
||||
print '<span span id="TypeName" class="fieldrequired"><label for="name">'.$langs->trans('ThirdPartyName').'</label></span>';
|
||||
}
|
||||
print '</td><td'.(empty($conf->global->SOCIETE_USEPREFIX)?' colspan="3"':'').'>';
|
||||
print '<input type="text" size="30" maxlength="60" name="nom" id="name" value="'.$object->name.'" autofocus="autofocus"></td>';
|
||||
print '<input type="text" size="60" maxlength="128" name="nom" id="name" value="'.$object->name.'" autofocus="autofocus"></td>';
|
||||
if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field
|
||||
{
|
||||
print '<td>'.$langs->trans('Prefix').'</td><td><input type="text" size="5" maxlength="5" name="prefix_comm" value="'.$object->prefix_comm.'"></td>';
|
||||
@ -816,7 +832,7 @@ else
|
||||
if ($conf->use_javascript_ajax)
|
||||
{
|
||||
print '<tr class="individualline"><td><label for="firstname">'.$langs->trans('FirstName').'</label></td>';
|
||||
print '<td><input type="text" size="30" name="firstname" id="firstname" value="'.$object->firstname.'"></td>';
|
||||
print '<td><input type="text" size="60" name="firstname" id="firstname" value="'.$object->firstname.'"></td>';
|
||||
print '<td colspan=2> </td></tr>';
|
||||
print '<tr class="individualline"><td><label for="civility_id">'.$langs->trans("UserTitle").'</label></td><td>';
|
||||
print $formcompany->select_civility($object->civility_id).'</td>';
|
||||
@ -1179,6 +1195,10 @@ else
|
||||
$object->tva_intra = GETPOST('tva_intra', 'alpha');
|
||||
$object->status = GETPOST('status', 'int');
|
||||
|
||||
// Webservices url/key
|
||||
$object->webservices_url = GETPOST('webservices_url', 'custom', 0, FILTER_SANITIZE_URL);
|
||||
$object->webservices_key = GETPOST('webservices_key', 'san_alpha');
|
||||
|
||||
//Local Taxes
|
||||
$object->localtax1_assuj = GETPOST('localtax1assuj_value');
|
||||
$object->localtax2_assuj = GETPOST('localtax2assuj_value');
|
||||
@ -1266,7 +1286,7 @@ else
|
||||
|
||||
// Name
|
||||
print '<tr><td><label for="name"><span class="fieldrequired">'.$langs->trans('ThirdPartyName').'</span></label></td>';
|
||||
print '<td colspan="3"><input type="text" size="40" maxlength="60" name="nom" id="name" value="'.dol_escape_htmltag($object->name).'" autofocus="autofocus"></td></tr>';
|
||||
print '<td colspan="3"><input type="text" size="60" maxlength="128" name="nom" id="name" value="'.dol_escape_htmltag($object->name).'" autofocus="autofocus"></td></tr>';
|
||||
|
||||
// Prefix
|
||||
if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field
|
||||
@ -1558,6 +1578,14 @@ else
|
||||
print $object->showOptionals($extrafields,'edit');
|
||||
}
|
||||
|
||||
// Webservices url/key
|
||||
if (!empty($conf->syncsupplierwebservices->enabled)) {
|
||||
print '<tr><td><label for="webservices_url">'.$langs->trans('WebServiceURL').'</label></td>';
|
||||
print '<td><input type="text" name="webservices_url" id="webservices_url" size="32" value="'.$object->webservices_url.'"></td>';
|
||||
print '<td><label for="webservices_key">'.$langs->trans('WebServiceKey').'</label></td>';
|
||||
print '<td><input type="text" name="webservices_key" id="webservices_key" size="32" value="'.$object->webservices_key.'"></td></tr>';
|
||||
}
|
||||
|
||||
// Logo
|
||||
print '<tr class="hideonsmartphone">';
|
||||
print '<td><label for="photoinput">'.$langs->trans("Logo").'</label></td>';
|
||||
@ -1698,7 +1726,11 @@ else
|
||||
// Status
|
||||
print '<tr><td>'.$langs->trans("Status").'</td>';
|
||||
print '<td colspan="'.(2+(($showlogo || $showbarcode)?0:1)).'">';
|
||||
print $object->getLibStatut(2);
|
||||
if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer) {
|
||||
print ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased');
|
||||
} else {
|
||||
print $object->getLibStatut(2);
|
||||
}
|
||||
print '</td>';
|
||||
print $htmllogobar; $htmllogobar='';
|
||||
print '</tr>';
|
||||
@ -2014,6 +2046,12 @@ else
|
||||
print "</tr>\n";
|
||||
}
|
||||
|
||||
// Webservices url/key
|
||||
if (!empty($conf->syncsupplierwebservices->enabled)) {
|
||||
print '<tr><td>'.$langs->trans("WebServiceURL").'</td><td>'.dol_print_url($object->webservices_url).'</td>';
|
||||
print '<td class="nowrap">'.$langs->trans('WebServiceKey').'</td><td>'.$object->webservices_key.'</td></tr>';
|
||||
}
|
||||
|
||||
print '</table>';
|
||||
|
||||
dol_fiche_end();
|
||||
|
||||
BIN
htdocs/theme/eldy/img/background.png
Normal file
BIN
htdocs/theme/eldy/img/background.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
@ -223,7 +223,6 @@ body {
|
||||
background-color: #FFFFFF;
|
||||
<?php } else { ?>
|
||||
background: <?php print $colorbackbody; ?>;
|
||||
/* background-image: url("<?php print DOL_URL_ROOT.'/theme/eldy/img/background.png'; ?>"); */
|
||||
<?php } ?>
|
||||
color: #101010;
|
||||
font-size: <?php print $fontsize ?>px;
|
||||
@ -832,9 +831,9 @@ foreach($mainmenuusedarray as $val)
|
||||
.bodylogin
|
||||
{
|
||||
background: #f0f0f0;
|
||||
/*-moz-box-shadow: inset 0 0 10px #000000;
|
||||
/* -moz-box-shadow: inset 0 0 10px #000000;
|
||||
-webkit-box-shadow: inset 0 0 10px #000000;
|
||||
box-shadow: inset 0 0 10px #000000;*/
|
||||
box-shadow: inset 0 0 10px #000000; */
|
||||
}
|
||||
.login_vertical_align {
|
||||
padding: 10px;
|
||||
@ -861,17 +860,28 @@ form#login {
|
||||
padding-top:12px;
|
||||
padding-bottom:12px;
|
||||
max-width: 540px;
|
||||
border: 1px solid #A0A0A0;
|
||||
|
||||
border-radius: 8px;
|
||||
border:solid 1px rgba(90,90,90,.4);
|
||||
background-color: #FFFFFF;
|
||||
|
||||
-moz-box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(60,60,60,0.15);
|
||||
-webkit-box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(60,60,60,0.15);
|
||||
box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(60,60,60,0.15);
|
||||
/*-moz-box-shadow: 3px 2px 20px #CCC;
|
||||
-webkit-box-shadow: 3px 2px 20px #CCC;
|
||||
box-shadow: 3px 2px 20px #CCC;*/
|
||||
|
||||
background-color: #FFFFFF;
|
||||
background: -webkit-gradient(linear, center top, center bottom, color-stop(0%, #fff), color-stop(100%, #f8f8f8));
|
||||
background: -moz-linear-gradient(top, #fff, #f8f8f8);
|
||||
border-radius: 8px;
|
||||
border:solid 1px rgba(80,80,80,.4);
|
||||
|
||||
border-top:solid 1px f8f8f8;
|
||||
/*
|
||||
background-color: #f8f8f8;
|
||||
background-image: -o-linear-gradient(top, rgba(250,250,250,.6) 0%, rgba(192,192,192,.3) 100%);
|
||||
background-image: -moz-linear-gradient(top, rgba(250,250,250,.6) 0%, rgba(192,192,192,.3) 100%);
|
||||
background-image: -webkit-linear-gradient(top, rgba(250,250,250,.6) 0%, rgba(192,192,192,.3) 100%);
|
||||
background-image: -ms-linear-gradient(top, rgba(250,250,250,.6) 0%, rgba(192,192,192,.3) 100%);
|
||||
background-image: linear-gradient(top, rgba(250,250,250,.6) 0%, rgba(192,192,192,.3) 100%);
|
||||
*/
|
||||
}
|
||||
div#login_left, div#login_right {
|
||||
display: inline-block;
|
||||
|
||||
@ -525,7 +525,15 @@ function createInvoice($authentication,$invoice)
|
||||
$newobject->statut=0; // We start with status draft
|
||||
$newobject->fk_project=$invoice['project_id'];
|
||||
$newobject->date_creation=$now;
|
||||
$newobject->mode_reglement_id = $invoice['payment_mode_id'];
|
||||
|
||||
//take mode_reglement and cond_reglement from thirdparty
|
||||
$soc = new Societe($db);
|
||||
$res=$soc->fetch($newobject->socid);
|
||||
if ($res > 0) {
|
||||
$newobject->mode_reglement_id = ! empty($invoice['payment_mode_id'])?$invoice['payment_mode_id']:$soc->mode_reglement_id;
|
||||
$newobject->cond_reglement_id = $soc->cond_reglement_id;
|
||||
}
|
||||
else $newobject->mode_reglement_id = $invoice['payment_mode_id'];
|
||||
|
||||
// Trick because nusoap does not store data with same structure if there is one or several lines
|
||||
$arrayoflines=array();
|
||||
|
||||
@ -71,6 +71,7 @@ $newlangid='en_EN'; // To force a new lang id
|
||||
$filter=array();
|
||||
$regenerate=''; // Ask regenerate (contains name of model to use)
|
||||
$option='';
|
||||
$fileprefix='mergedpdf';
|
||||
|
||||
foreach ($argv as $key => $value)
|
||||
{
|
||||
@ -84,6 +85,13 @@ foreach ($argv as $key => $value)
|
||||
$newlangid=$valarray[1];
|
||||
print 'Use language '.$newlangid.".\n";
|
||||
}
|
||||
if (preg_match('/^prefix=/i',$value))
|
||||
{
|
||||
$found=true;
|
||||
$valarray=explode('=',$value);
|
||||
$fileprefix=$valarray[1];
|
||||
print 'Use prefix for filename '.$fileprefix.".\n";
|
||||
}
|
||||
|
||||
if (preg_match('/^regenerate=(.*)/i',$value,$reg))
|
||||
{
|
||||
@ -232,7 +240,7 @@ if (in_array('bank',$filter) && in_array('nopayment',$filter))
|
||||
|
||||
// Define SQL and SQL request to select invoices
|
||||
// Use $filter, $dateafterdate, datebeforedate, $paymentdateafter, $paymentdatebefore
|
||||
$result=rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid, $thirdpartiesid);
|
||||
$result=rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid, $thirdpartiesid, $fileprefix);
|
||||
|
||||
|
||||
|
||||
@ -283,6 +291,7 @@ function usage()
|
||||
print "To limit to some thirdparties, use filter=onlythirdparties id1,id2...\n";
|
||||
print "To regenerate existing PDF, use regenerate=crabe\n";
|
||||
print "To generate invoices in a language, use lang=xx_XX\n";
|
||||
print "To set prefix of generated file name, use prefix=myfileprefix\n";
|
||||
print "\n";
|
||||
print "Example: ".$script_file." filter=payments 20080101 20081231 lang=fr_FR regenerate=crabe\n";
|
||||
print "Example: ".$script_file." filter=all lang=en_US\n";
|
||||
|
||||
@ -215,7 +215,7 @@ class FactureTest extends PHPUnit_Framework_TestCase
|
||||
$newlocalobject=new Facture($this->savdb);
|
||||
$newlocalobject->initAsSpecimen();
|
||||
$this->changeProperties($newlocalobject);
|
||||
$this->assertEquals($this->objCompare($localobject,$newlocalobject,true,array('id','lines','client','thirdparty','brouillon','user_author','date_creation','date_validation','datem','ref','statut','paye','specimen','facnumber','actiontypecode','actionmsg2','actionmsg','mode_reglement','cond_reglement','cond_reglement_doc')), array()); // Actual, Expected
|
||||
$this->assertEquals($this->objCompare($localobject,$newlocalobject,true,array('newref','oldref','id','lines','client','thirdparty','brouillon','user_author','date_creation','date_validation','datem','ref','statut','paye','specimen','facnumber','actiontypecode','actionmsg2','actionmsg','mode_reglement','cond_reglement','cond_reglement_doc')), array()); // Actual, Expected
|
||||
|
||||
return $localobject;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user