A-
A+
Contraste
Acessibilidade
saveTicketsToLocalStorage()"
@load-tickets-from-local-storage.window="event => loadTicketsFromLocalStorage()" x-data="{
seatsIoPublicKey: '8e2451aa-c962-42b0-a3e4-0c29cc653b84',
charts: [],
categoryPrices: [],
selectedTickets: [],
ignoreFirstSelectedSeats: [],
selectedSeats: [],
alertMessages: [],
lastOpenCategoryListIdMap: null,
setMapId: null,
notifications: [],
qtdTickets: 0,
subtotal: 0,
total: 0,
totalDiscount: 0,
lastCategoryPrice: null,
couponCode: null,
isShowBoxCouponCode: false,
setCouponCode(code) {
code = code ?? null;
code = '' + code;
this.couponCode = code;
this.isShowBoxCouponCode = code != null && code.trim().length > 0;
},
showBoxCouponCode() {
this.isShowBoxCouponCode = true;
setTimeout(() => {
this.$refs.couponCode.focus();
}, 130);
},
labelButtonCheckout() {
return this.qtdTickets > 0 ? 'Finalizar compra' : 'Selecione um ingresso';
},
normalizePrices(categoryPrices = []) {
let ticketTypes = [];
const groupByCategoryLabel = categoryPrices.reduce((categoryPrices, categoryPrice) => {
if (categoryPrices.hasOwnProperty(categoryPrice.seatsioCategory) == false) {
categoryPrices[categoryPrice.seatsioCategory] = [];
}
categoryPrices[categoryPrice.seatsioCategory].push(categoryPrice);
return categoryPrices;
}, {});
for (let key in groupByCategoryLabel) {
const categoryPrices = groupByCategoryLabel[key];
ticketTypes.push({
category: key,
ticketTypes: this.getPayloadTicketMap(categoryPrices),
});
}
return ticketTypes;
},
hasDiscountOnCategoryPrice(categoryPrice) {
return categoryPrice.isAppliedCoupon == true && categoryPrice.priceWithDiscount >= 0;
},
calculatePriceWithConvenienceFee(price, convenienceFee) {
return +price + +convenienceFee;
},
getPayloadTicketMap(categoryPrices) {
return categoryPrices.map((categoryPrice) => {
let payloadPrice = {
price: categoryPrice.price,
convenienceFee: categoryPrice.convenienceFee,
};
if (this.hasDiscountOnCategoryPrice(categoryPrice)) {
payloadPrice = {
price: categoryPrice.priceWithDiscount,
convenienceFee: categoryPrice.convenienceFeeWithDiscount,
};
}
return {
ticketType: categoryPrice.name,
price: this.calculatePriceWithConvenienceFee(payloadPrice.price, payloadPrice.convenienceFee),
priceWithoutConvenienceFee: payloadPrice.price,
convenienceFee: payloadPrice.convenienceFee,
seatsQtd: categoryPrice.seatsCapacity,
ticketSku: categoryPrice.id,
description: categoryPrice.description,
category_label: categoryPrice.seatsioLabel,
}
});
},
getPayloadSeat(objectSeat, selectedTicketType) {
return {
selectedSeat: objectSeat.label,
event: objectSeat.chart.config.event,
category: objectSeat.category.label,
objectType: objectSeat.objectType,
ticketType: selectedTicketType.ticketType,
seatsQtd: selectedTicketType.seatsQtd,
}
},
getSelectedSeats(eventKey) {
if (this.selectedSeats.hasOwnProperty(eventKey) == false) {
return [];
}
return this.selectedSeats[eventKey];
},
cleanSelecionMaps() {
if (typeof this.charts !== 'undefined') {
const keys = Object.keys(this.charts);
keys.forEach(key => {
this.charts[key].clearSelection();
});
}
this.selectedSeats = [];
},
setAlertMessage(id, message, type) {
const findAlertMessage = this.alertMessages.find(obj => obj.id == id && obj.type == type);
if (findAlertMessage) {
findAlertMessage.message = message;
} else {
this.alertMessages.push({
id: id,
message: message,
type: type,
});
}
},
removeAlertMessage(id, type) {
this.alertMessages = this.alertMessages.filter(obj => obj.id != id && obj.type != type);
},
getAlertMessage(id, type) {
const findAlert = this.alertMessages.find(obj => obj.id == id && obj.type == type);
if (findAlert) {
return findAlert.message;
}
return null;
},
cleanSelecionMapByEventKey(event) {
if (this.charts.hasOwnProperty(event) == false) {
return false;
}
this.charts[event].clearSelection();
if (this.selectedSeats.hasOwnProperty(event) == false) {
return false;
}
this.selectedSeats[event] = [];
},
cleanCategoryPrices() {
for (let key in this.categoryPrices) {
this.categoryPrices[key].quantity = 0;
this.categoryPrices[key].seats = [];
this.categoryPrices[key].total = 0;
}
},
cleanSelectedTickets() {
for (let key in this.selectedTickets) {
this.selectedTickets[key].quantity = 0;
this.selectedTickets[key].total = 0;
}
},
hasSelectedSeatsByOtherEventKey(eventKey) {
const countSelectedSeats = Object.keys(this.selectedSeats).length;
if (countSelectedSeats == 0) {
return false;
}
return Object.keys(this.selectedSeats).filter(key => key != eventKey).reduce((counter, eventKeyId) => this.selectedSeats[eventKeyId].length > 0 ? counter += 1 : counter, 0) > 0;
},
resizeMapTicketBox() {
if (this.setMapId == null) {
return false;
}
const modal = $('#' + this.setMapId);
if (modal.length == 0) {
return false;
}
const columnItemsMap = modal.find('.col-items-map');
const gridItems = modal.find('.grid-items');
const widthOfWindow = $(window).width();
if (widthOfWindow < 1000) {
columnItemsMap.css('height', 'auto');
gridItems.css('max-height', '260px');
return;
}
const iframe = modal.find('iframe');
if (iframe.length == 0) {
return false;
}
const iframeHeight = iframe.height();
columnItemsMap.css('height', iframeHeight + 'px');
const percentage = 70;
const calculatePercentageHeight = Math.round((iframeHeight * percentage) / 100);
gridItems.css('max-height', calculatePercentageHeight + 'px');
},
openSeatMap(categoryId, categoryListId = 0, chartId, eventKey) {
const hasSelectedSeatsByOtherEventKey = this.hasSelectedSeatsByOtherEventKey(eventKey);
if (hasSelectedSeatsByOtherEventKey) {
this.showNotification('Permitido apenas um mapa por compra. Já foram selecionados assentos em outro mapa.');
return false;
}
this.lastOpenCategoryListIdMap = categoryListId > 0 ? categoryListId : null;
this.setMapId = 'modal-map-' + eventKey + '--' + chartId;
$('#' + this.setMapId).modal('show');
},
findSelectedTicket(categoryPriceId, categoryId, categoryListId = null) {
categoryListId = categoryListId ?? 0;
const findSelectedTicket = this.selectedTickets.find(obj => obj.categoryPriceId == categoryPriceId && obj.categoryId == categoryId && obj.categoryListId == categoryListId);
if (findSelectedTicket) {
return findSelectedTicket;
}
return null;
},
addSelectedTickets(categoryPriceId, categoryId, categoryListId = null) {
categoryListId = categoryListId ?? 0;
const findSelectedTicket = this.findSelectedTicket(categoryPriceId, categoryId, categoryListId);
if (findSelectedTicket) {
return false;
}
this.selectedTickets.push({
categoryListId: categoryListId,
categoryId,
categoryPriceId,
quantity: 0,
total: 0,
});
},
addCategoryPrice(id, categoryId, categoryListIds = [], isBooking, price, convenienceFee, priceWithDiscount, convenienceFeeWithDiscount, perUserLimit, isAppliedCoupon = false) {
this.categoryPrices[id] = {
id: id,
categoryId: categoryId,
quantity: 0,
isBooking,
seats: [],
categoryListIds: categoryListIds,
isAppliedCoupon: isAppliedCoupon,
selectedSeats: [],
price: parseFloat(price),
isAppliedCoupon: isAppliedCoupon,
convenienceFee: parseFloat(convenienceFee),
priceWithDiscount: parseFloat(priceWithDiscount),
convenienceFeeWithDiscount: parseFloat(convenienceFeeWithDiscount),
total: 0,
totalDiscount: 0,
perUserLimit: parseInt(perUserLimit)
};
},
isReservedSeatByOtherBuyer(status) {
return status != 'free';
},
addChart(eventKey, maxSelectedSeats, categoryPrices, notAllowedSeats = '') {
this.charts[eventKey] = new seatsio.SeatingChart({
divId: `seat-map-${eventKey}`,
publicKey: this.seatsIoPublicKey,
event: eventKey,
session: 'none',
selectedObjects: this.getSelectedSeats(eventKey),
objectWithoutPricingSelectable: false,
language: 'pt',
extraConfig: {
notAllowedSeats,
},
isObjectVisible: function(object, extraConfig) {
if (extraConfig.notAllowedSeats !== undefined && extraConfig.notAllowedSeats !== '') {
let naSeats = extraConfig.notAllowedSeats.split(',');
return !naSeats.includes(object.label);
}
return true;
},
objectColor: function(object, defaultColor, extraConfig) {
if (extraConfig.notAllowedSeatsForCustomer !== undefined && extraConfig.notAllowedSeatsForCustomer !== '') {
let nacSeats = extraConfig.notAllowedSeatsForCustomer.split(',');
if (nacSeats.includes(object.label)) {
if (object.status === 'booked')
return '#bd9ce1';
else
return '#8e26ff';
}
}
return defaultColor;
},
maxSelectedObjects: maxSelectedSeats,
pricing: this.normalizePrices(JSON.parse(categoryPrices)),
priceFormatter: (price) => {
return 'R$ ' + number_format(price, 2, ',', '.');
},
onObjectSelected: (object, selectedTicketType) => {
const payloadSeat = this.getPayloadSeat(object, selectedTicketType);
this.incrementQuantity(selectedTicketType.ticketSku, this.lastOpenCategoryListIdMap, payloadSeat);
},
onObjectDeselected: (object, selectedTicketType) => {
if (this.isReservedSeatByOtherBuyer(object.status)) {
this.showNotification(`Assento ${obj.labels.displayedLabel} reservado por outro comprador.`);
}
const payloadSeat = this.getPayloadSeat(object, selectedTicketType);
this.decrementQuantity(selectedTicketType.ticketSku, this.lastOpenCategoryListIdMap, payloadSeat);
},
onChartRendered: (chart) => {
this.resizeMapTicketBox();
window.addEventListener('resize', () => {
this.resizeMapTicketBox();
});
}
}).render();
},
addSelectedSeats(seat) {
if (this.selectedSeats.hasOwnProperty(seat.event) == false) {
this.selectedSeats[seat.event] = [];
}
this.selectedSeats[seat.event].push({
label: seat.selectedSeat,
objectType: seat.objectType,
ticketType: seat.ticketType,
});
},
removeSelectedSeats(seat) {
if (this.selectedSeats.hasOwnProperty(seat.event) == false) {
return false;
}
if (seat.objectType == 'GeneralAdmissionArea') {
if (this.selectedSeats[seat.event].length > 0) {
this.selectedSeats[seat.event].pop();
return false;
}
}
this.selectedSeats[seat.event] = this.selectedSeats[seat.event].filter(s => s.label != seat.selectedSeat);
},
showNotification(msg, timeout = 4000) {
const timestamp = new Date().getTime();
const id = `${timestamp}_${Math.random()}`;
this.notifications.push({
id,
message: msg,
});
setTimeout(() => {
this.removeNotification(id);
}, timeout);
},
removeNotification(id) {
this.notifications = this.notifications.filter(notification => notification.id != id);
},
incrementQuantity(categoryPriceId, categoryListId = null, payloadSeat = null) {
categoryListId = categoryListId ?? 0;
if (this.categoryPrices.hasOwnProperty(categoryPriceId) == false) {
return false;
}
const categoryPrice = this.categoryPrices[categoryPriceId];
const isMap = categoryPrice.isBooking == true && payloadSeat && typeof payloadSeat === 'object';
if (isMap) {
if (this.ignoreFirstSelectedSeats.hasOwnProperty(payloadSeat.event)) {
if (this.ignoreFirstSelectedSeats[payloadSeat.event].count + 1 <= this.ignoreFirstSelectedSeats[payloadSeat.event].quantity) {
this.ignoreFirstSelectedSeats[payloadSeat.event].count++;
return false;
}
}
}
if (isMap && this.categoryPrices[categoryPriceId].seats.length >= 0) {
const seats = this.categoryPrices[categoryPriceId].seats;
if (seats.filter(s => s.objectType != 'GeneralAdmissionArea' && s.selectedSeat == payloadSeat.selectedSeat).length > 0) {
return false;
}
}
if (categoryPrice.isBooking == false) {
if (parseInt(categoryPrice.perUserLimit) < parseInt(categoryPrice.quantity) + 1) {
const message = 'Limite de ingressos por cliente atingido.';
this.showNotification(message);
return false;
}
}
this.lastCategoryPrice = categoryPrice;
this.categoryPrices[categoryPriceId].quantity++;
if (isMap) {
this.categoryPrices[categoryPriceId].seats.push(payloadSeat);
this.categoryPrices[categoryPriceId].selectedSeats = this.categoryPrices[categoryPriceId].seats.map(seat => seat.selectedSeat);
this.addSelectedSeats(payloadSeat);
}
const price = this.getPrice(categoryPrice);
this.categoryPrices[categoryPriceId].total = categoryPrice.quantity * price;
this.incrementSelectedTickets(categoryPriceId, categoryPrice.categoryId, categoryListId, 1, price);
},
decrementQuantity(categoryPriceId, categoryListId = null, payloadSeat = null) {
categoryListId = categoryListId ?? 0;
if (this.categoryPrices.hasOwnProperty(categoryPriceId) == false) {
return false;
}
const categoryPrice = this.categoryPrices[categoryPriceId];
if (categoryPrice.quantity == 0) {
return false;
}
const findSelectedTicket = this.findSelectedTicket(categoryPriceId, categoryPrice.categoryId, categoryListId);
if (!findSelectedTicket) {
return false;
}
if (payloadSeat == null) {
if (parseInt(categoryPrice.perUserLimit) == parseInt(categoryPrice.quantity) && findSelectedTicket.quantity == 0 || (parseInt(categoryPrice.quantity) > 0 && findSelectedTicket.quantity == 0) || parseInt(categoryPrice.quantity) == 0) {
return false;
}
}
this.removeAlertMessage(categoryPriceId, 'category_price');
this.lastCategoryPrice = categoryPrice;
this.categoryPrices[categoryPriceId].quantity--;
let isMap = payloadSeat && typeof payloadSeat === 'object';
if (isMap) {
if (this.categoryPrices[categoryPriceId].seats.filter(s => s.selectedSeat == payloadSeat.selectedSeat).length > 0) {
if (payloadSeat.objectType == 'GeneralAdmissionArea') {
let allSeatsOfCagteoryPrice = this.categoryPrices[categoryPriceId].seats;
allSeatsOfCagteoryPrice.pop();
this.categoryPrices[categoryPriceId].seats = allSeatsOfCagteoryPrice;
this.categoryPrices[categoryPriceId].selectedSeats = allSeatsOfCagteoryPrice.map(seat => seat.selectedSeat);
} else {
this.categoryPrices[categoryPriceId].seats = this.categoryPrices[categoryPriceId].seats.filter(s => s.selectedSeat != payloadSeat.selectedSeat);
this.categoryPrices[categoryPriceId].selectedSeats = this.categoryPrices[categoryPriceId].seats.map(seat => seat.selectedSeat);
}
this.removeSelectedSeats(payloadSeat);
}
}
const price = this.getPrice(categoryPrice);
this.categoryPrices[categoryPriceId].total = categoryPrice.quantity * price;
if (isMap) {
this.decrementSelectedTicketsByCategory(categoryPrice.categoryId, 1, price);
} else {
this.decrementSelectedTickets(categoryPriceId, categoryPrice.categoryId, categoryListId, 1, price);
}
},
getPrice(categoryPrice) {
const { price, convenienceFee, priceWithDiscount, convenienceFeeWithDiscount } = categoryPrice;
if (this.hasDiscountOnCategoryPrice(categoryPrice)) {
return (+priceWithDiscount + +convenienceFeeWithDiscount);
}
return (+price + +convenienceFee);
},
incrementSelectedTickets(categoryPriceId, categoryId, categoryListId = null, quantity = 1, subTotal = 0) {
categoryListId = categoryListId ?? 0;
const findObjectCategoryList = this.findSelectedTicket(categoryPriceId, categoryId, categoryListId);
if (findObjectCategoryList) {
findObjectCategoryList.quantity += quantity;
findObjectCategoryList.total += subTotal;
}
},
decrementSelectedTicketsByCategory(categoryId, quantity = 1, subTotal = 0) {
const findObjectCategoryList = this.selectedTickets.filter(obj => obj.categoryId == categoryId);
for (let i = 0; i < findObjectCategoryList.length; i++) {
const element = findObjectCategoryList[i];
if (element.quantity > 0) {
element.quantity -= quantity;
element.total -= subTotal;
}
}
},
decrementSelectedTickets(categoryPriceId, categoryId, categoryListId = null, quantity = 1, subTotal = 0) {
categoryListId = categoryListId ?? 0;
const findObjectCategoryList = this.findSelectedTicket(categoryPriceId, categoryId, categoryListId);
if (findObjectCategoryList) {
findObjectCategoryList.quantity -= quantity;
findObjectCategoryList.total -= subTotal;
}
},
getQuantityTicketSelectedByCategory(categoryId) {
return this.selectedTickets.filter(obj => obj.categoryId == categoryId).reduce((quantity, item) => {
return quantity + item.quantity;
}, 0);
},
getQuantityTicketsByCategoryAndList(categoryId, categoryListId = 0) {
categoryListId = categoryListId ?? 0;
return this.selectedTickets.filter(obj => obj.categoryId == categoryId && obj.categoryListId == categoryListId).reduce((quantity, item) => {
return quantity + item.quantity;
}, 0);
},
getQuantitySelectedTicketsByList(categoryListId) {
return this.selectedTickets.filter(obj => obj.categoryListId == categoryListId).reduce((quantity, item) => {
return quantity + item.quantity;
}, 0);
},
getQuantityTicketSelected(categoryPriceId, categoryId, categoryListId = 0) {
categoryListId = categoryListId ?? 0;
const findObjectCategoryList = this.findSelectedTicket(categoryPriceId, categoryId, categoryListId);
if (findObjectCategoryList) {
return findObjectCategoryList.quantity;
}
return 0;
},
getLabelQuantityTickets() {
return this.qtdTickets > 1 ? `${this.qtdTickets} ingressos` : `${this.qtdTickets} ingresso`;
},
labelSelectedSeats(categoryPriceId) {
const categoryPrice = this.categoryPrices[categoryPriceId] ?? null;
if (categoryPrice == null) {
return '';
}
const labelSelectedSeats = categoryPrice.seats.reduce((seats, seat) => {
return seats + seat.selectedSeat + ', ';
}, '');
return labelSelectedSeats.substring(0, labelSelectedSeats.length - 2);
},
cleanCart() {
if (!confirm('Deseja realmente limpar o carrinho?')) {
return false;
}
this.cleanSelecionMaps();
this.cleanCategoryPrices();
this.cleanSelectedTickets();
this.lastCategoryPrice = null;
this.notifications = [];
this.ignoreFirstSelectedSeats = [];
this.alertMessages = [];
this.discount = 0;
this.subtotal = 0;
},
saveTicketsToLocalStorage() {
let tickets = JSON.parse(localStorage.getItem('selectedTickets') ?? '[]');
this.selectedTickets.filter(selectedTicket => selectedTicket.quantity > 0).forEach(selectedTicket => {
tickets.push({
categoryPriceId: selectedTicket.categoryPriceId,
categoryId: selectedTicket.categoryId,
categoryListId: selectedTicket.categoryListId ?? 0,
quantity: selectedTicket.quantity,
seats: this.categoryPrices[selectedTicket.categoryPriceId].seats,
selectedSeats: this.categoryPrices[selectedTicket.categoryPriceId].selectedSeats,
});
});
localStorage.setItem('selectedTickets', JSON.stringify(tickets));
},
loadTicketsFromLocalStorage() {
const selectedTickets = JSON.parse(localStorage.getItem('selectedTickets') ? localStorage.getItem('selectedTickets') : '[]');
const allSelectedSeats = [];
let hasIncrementCategoryPrice = [];
this.ignoreFirstSelectedSeats = [];
const groupBooking = selectedTickets.filter(categoryPrice => categoryPrice.seats.length > 0).reduce((groupBooking, categoryPrice) => {
if (groupBooking.hasOwnProperty(categoryPrice.categoryId) == false) {
groupBooking[categoryPrice.categoryId] = [];
}
groupBooking[categoryPrice.categoryId].push(categoryPrice);
return groupBooking;
}, []);
if (groupBooking.length > 0) {
for (let cateogryId in groupBooking) {
if (groupBooking[cateogryId].length > 0) {
const sumQuantity = groupBooking[cateogryId].reduce((sum, categoryPrice) => {
return sum + categoryPrice.quantity;
}, 0);
const getEventKey = groupBooking[cateogryId][0].seats[0].event;
this.ignoreFirstSelectedSeats[getEventKey] = {
count: 0,
quantity: sumQuantity,
};
}
}
}
for (var i = 0; selectedTickets.length > i; i++) {
const selectedTicket = selectedTickets[i];
const categoryPriceId = selectedTicket.categoryPriceId;
const categoryId = selectedTicket.categoryId;
const categoryListId = selectedTicket.categoryListId ?? 0;
const quantity = selectedTicket.quantity;
const seats = selectedTicket.seats;
const selectedSeats = selectedTicket.selectedSeats;
if (this.categoryPrices.hasOwnProperty(categoryPriceId) == false) {
continue;
}
const categoryPrice = this.categoryPrices[categoryPriceId];
const price = this.getPrice(categoryPrice);
const subTotal = parseInt(quantity) * price;
if (hasIncrementCategoryPrice.hasOwnProperty(categoryPriceId) == false) {
categoryPrice.quantity = quantity;
categoryPrice.seats = seats;
categoryPrice.selectedSeats = selectedSeats;
categoryPrice.total = subTotal;
this.incrementSelectedTickets(categoryPriceId, categoryId, categoryListId, quantity, subTotal);
seats.map(seat => {
if (allSelectedSeats.hasOwnProperty(seat.event) == false) {
allSelectedSeats[seat.event] = [];
}
if (seat.objectType == 'GeneralAdmissionArea') {
allSelectedSeats[seat.event].push({
label: seat.selectedSeat,
ticketType: seat.ticketType
});
} else {
if (allSelectedSeats[seat.event].filter(s => s.label == seat.selectedSeat).length == 0) {
allSelectedSeats[seat.event].push({
label: seat.selectedSeat,
ticketType: seat.ticketType
});
}
}
});
const eventKeys = Object.keys(allSelectedSeats);
eventKeys.forEach(eventKey => {
if (this.charts.hasOwnProperty(eventKey) !== false) {
this.charts[eventKey].selectObjects(allSelectedSeats[eventKey]);
}
});
hasIncrementCategoryPrice[categoryPriceId] = true;
}
}
this.cleanLocalStorage();
},
cleanLocalStorage() {
localStorage.removeItem('selectedTickets');
}
}"
x-init="$watch('categoryPrices', value => {
const allCategoryPrices = Object.values(value ?? []);
qtdTickets = allCategoryPrices.reduce((qtd, categoryPrice) => {
return qtd + parseInt(categoryPrice.quantity);
}, 0);
if (lastCategoryPrice && lastCategoryPrice.categoryListId) {
subtotal = allCategoryPrices.reduce((price, categoryPrice) => {
if (categoryPrice.categoryListId == lastCategoryPrice.categoryListId) {
return price + +categoryPrice.total;
}
return price;
}, 0);
}
total = allCategoryPrices.reduce((price, categoryPrice) => {
return price + parseFloat(categoryPrice.total);
}, 0);
})">
EDUCATIVO - PRIMEIRO BRINCAR
01 out - 2023 • 09h > 30 dez - 2023 • 20h CCBB SP - São Paulo, São Paulo
Atenção:
- Os ingressos são liberados na sexta-feira da semana anterior de cada final de semana às 12h.
- Todos os visitantes devem possuir ingresso para acessar o prédio.
- Crianças a partir de 3 anos necessitam de validação de ingresso.
- Não é permitido o consumo de alimentos e bebidas no interior das galerias do CCBB.
- Planeje sua visita com pequena quantidade de pertences.
- Van - ida e volta gratuita, saindo da Rua da Consolação, 228. No trajeto de volta, há uma parada no Metrô República.
- Funcionamento a partir das 12 horas.
- Clique aqui e leia atentamente as normas de visitação do CCBB, para a segurança de visitantes e colaboradores.
Sobre o evento:
Atividade para famílias com crianças de 0 a 3 anos em um espaço com objetos interativos, adaptados para experimentações nesse primeiro contato com a arte.
Serviços:
Data: 01 à 30/12/2023
Sábados e domingos às 15h às 16h
Local: Mezanino.
Classificação etária: famílias com crianças de 0 a 3 anos
Entrada gratuita
Evento organizado por:
Centro Cultural Banco do Brasil - São Paulo.
Endereço: R. Álvares Penteado, 112 -
Centro Histórico de São Paulo, São Paulo - SP - 01012-000.
Abrir no Google Maps.
Plataforma de venda ticketWORK
A ticketWORK é uma plataforma que facilita a venda de ingressos, inscrição para eventos, cobrança de contribuições para eventos e a gestão de participantes. Todos os eventos publicados na plataforma estão sob responsabilidade de seus organizadores, uma vez que a ticketWORK não produz tais eventos.
A ticketWORK não se responsabiliza por compras efetuadas em canais não oficiais.