{#
* Plugin Name : ProductOption
*
* Copyright (C) BraTech Co., Ltd. All Rights Reserved.
* http://www.bratech.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
#}
{% block css %}
<style type="text/css">
.datepicker-days th.dow:first-child,
.datepicker-days td:first-child {
color: #f00;
}
.datepicker-days th.dow:last-child,
.datepicker-days td:last-child {
color: #00f;
}
</style>
{% endblock %}
{% block javascript %}
<script src="{{ asset('../../plugin/ProductOption42/assets/js/jquery.plainmodal.min.js') }}"></script>
<script>
$(function() {
//デフォルトのデイトタイムピッカーが存在しない場合
if ($('[type="date"]').prop('type') !== 'date') {
$.getScript("{{ asset('assets/js/vendor/moment.min.js', 'admin') }}").done(function() {
$.getScript("{{ asset('assets/js/vendor/moment-with-locales.min.js', 'admin') }}").done(function() {
$.getScript("{{ asset('assets/js/vendor/tempusdominus-bootstrap-4.min.js', 'admin') }}").done(function() {
$('input[type=date]').datetimepicker({
locale: '{{ eccube_config.locale }}',
format: 'YYYY-MM-DD',
useCurrent: false,
buttons: {
showToday: true,
showClose: true
}
});
});
});
});
}
});
var product_id;
$(function() {
{% for ProductOption in ProductOptions %}
{% set Option = ProductOption.Option %}
{% set Product = ProductOption.Product %}
{% if Option.description_flg == constant('Plugin\\ProductOption42\\Entity\\OptionCategory::ON') %}
modal{{ Product.id }}_{{ Option.id }} = $('#option_description_{{ Product.id }}_{{ Option.id }}').plainModal();
$('#option_description_link_{{ Product.id }}_{{ Option.id }}').click(function() {
modal{{ Product.id }}_{{ Option.id }}.plainModal('open');
product_id = $(this).attr('data');
return false;
});
{% endif %}
{% endfor %}
});
$(function() {
$("[id^=desc_btn_]").click(function(){
var form_id;
var id = $(this).attr('id').replace(/^desc_btn_/ig, '');
var ids = id.split('_');
if (eccube.hasOwnProperty('productsClassCategories')) {
form_id = product_id;
}else{
form_id = 1;
}
var $form = $("form[name=form"+form_id+"]");
func_submit($form,ids[0],ids[1]);
onOptionChange($form)
});
$("[name^=productoption]").change(function(){
$form = $(this).parents('form');
onOptionChange($form);
});
});
function func_submit($form,optionId, setValue) {
var $sele_option = $form.find("[name=productoption" + optionId + "]");
if($sele_option && $sele_option.length){
var kind = $sele_option.attr("type");
if(kind == 'radio'){
$sele_option.val([setValue]);
}else{
$sele_option.val(setValue);
}
}else{
var $sele_option = $form.find('[name="productoption' + optionId + '[]"]');
if($sele_option && $sele_option.length){
$sele_option.each(function(){
if($(this).val() == setValue){
$(this).prop('checked',true);
}
});
}
}
$('#option_description_' + product_id + '_' + optionId).plainModal('close');
}
var optionPrice = {{ optionPrices|json_encode|raw }};
var optionPoint = {{ optionPoints|json_encode|raw }};
var optionMultiple = {{ optionMultiples|json_encode|raw }};
var taxRules = {{ taxRules|json_encode|raw }};
var default_class_id = {{ default_class_id|json_encode|raw }};
function onOptionChange($form){
if(!$form.length){
return;
}
var optionPriceTotal = 0;
var optionPointTotal = 0;
var tax_rate = null;
var tax_rule = null;
var product_id = $form.find('input[name="product_id"]').val();
var $sele1 = $form.find('select[name=classcategory_id1]');
var $sele2 = $form.find('select[name=classcategory_id2]');
var classcat_id1 = $sele1.val() ? $sele1.val() : '__unselected';
var classcat_id2 = $sele2.val() ? $sele2.val() : '';
if (eccube.hasOwnProperty('productsClassCategories')) {
// 商品一覧時
classcat2 = eccube.productsClassCategories[product_id][classcat_id1]['#' + classcat_id2];
} else {
// 詳細表示時
classcat2 = eccube.classCategories[classcat_id1]['#' + classcat_id2];
}
$form.find("[id^=productoption]").each(function(){
var id = $(this).prop("id");
var name = $(this).attr("name");
var option_id = null;
if(name === undefined){
name = $(this).find("input").prop("id");
}
if(name === undefined)return;
option_id = name.replace(/productoption/ig,'');
option_id = option_id.replace(/_\d+/ig,'');
option_id = option_id.replace(/\[\]/ig,'');
if(id.match(/^productoption\d+$/)){
var kind = $(this).prop('tagName');
var type = $(this).attr('type');
var value = null;
var multi = 1;
switch(kind){
case 'SELECT':
value = $(this).val();
break;
case 'TEXTAREA':
case 'INPUT':
var text = $(this).val();
if(text.length > 0){
value = 0;
}
if(type == 'number'){
if(optionMultiple[product_id][option_id]){
multi = $(this).val();
if(multi.length == 0)multi = 0;
}
}
break;
default:
if($(this).find('input[type="checkbox"]').length > 0){
value = [];
$(this).find('input[type="checkbox"]:checked').each(function(){
value.push($(this).val());
});
}else{
value = $form.find("input[name='productoption" + option_id + "']:checked").val();
}
break;
}
if($.isNumeric(value) || Array.isArray(value)){
if(Array.isArray(value)){
for(var key in value){
optionPriceTotal += parseFloat(optionPrice[product_id][option_id][value[key]]);
optionPointTotal += parseFloat(optionPoint[product_id][option_id][value[key]]);
}
}else{
optionPriceTotal += parseFloat(optionPrice[product_id][option_id][value]*multi);
optionPointTotal += parseFloat(optionPoint[product_id][option_id][value]*multi);
}
}
}
});
if(classcat2){
var product_class_id = classcat2.product_class_id;
}else{
var product_class_id = default_class_id[product_id];
}
var tax_rate = taxRules[product_class_id]['tax_rate'];
var tax_rule = taxRules[product_class_id]['tax_rule'];
var $option_price = $form.parent().find('#option_price_default').first();
$option_price.text(number_format(optionPriceTotal));
var $option_point = $form.parent().find('#option_price_inctax_default').first();
$option_point.text(number_format(optionPriceTotal + sfTax(optionPriceTotal, tax_rate, tax_rule)));
}
function number_format(num) {
return num.toString().replace(/([0-9]+?)(?=(?:[0-9]{3})+$)/g , '$1,');
}
function sfTax(price, tax_rate, tax_rule) {
real_tax = tax_rate / 100;
ret = price * real_tax;
tax_rule = parseInt(tax_rule);
switch (tax_rule) {
// 四捨五入
case {{ constant('Eccube\\Entity\\Master\\RoundingType::ROUND') }}:
$ret = Math.round(ret);
break;
// 切り捨て
case {{ constant('Eccube\\Entity\\Master\\RoundingType::FLOOR') }}:
$ret = Math.floor(ret);
break;
// 切り上げ
case {{ constant('Eccube\\Entity\\Master\\RoundingType::CEIL') }}:
$ret = Math.ceil(ret);
break;
// デフォルト:切り上げ
default:
$ret = Math.round(ret);
break;
}
return $ret;
}
</script>
{% endblock %}