HotelManager
Methods that allow a manager to create / administrate hotels
Example:
const hotel = new HotelManager({
indexAddress: '0x75a3...b', // Address of the WTIndex contract that lists this hotel
owner: '0xab3...cd', // Payer of lib tx fees, registered as owner the WTIndex
web3: web3, // Instantiated web3 object with its provider set.
});
Constructor Summary
| Public Constructor | ||
| public |
constructor(options: Object): HotelManager Instantiates a HotelManager with a web3 object, an owner account address, and the address of the Index contract that has registered hotel assets. |
Member Summary
| Public Members | ||
| public |
WTIndex: * |
|
| public |
context: * |
|
| public |
hotels: * |
|
| public |
hotelsAddrs: *[] |
|
| public |
owner: * |
|
| public |
web3: * |
Method Summary
| Public Methods | ||
| public |
async addAmenity(hotelAddress: Address, unitType: String, amenity: Number): Promievent Adds an amenity to a unit type |
|
| public |
async addImageHotel(hotelAddress: Address, url: String): Promievent Adds an image to a hotel |
|
| public |
async addImageUnitType(hotelAddress: Address, unitType: String, url: String): Promievent Adds an image to a unit type |
|
| public |
Deploys a Unit contract and registers it to an existing Hotel contract |
|
| public |
async addUnitType(hotelAddress: Address, unitType: String): Promievent Deploys a UnitType contract and registers it to an existing Hotel contract |
|
| public |
async changeHotelAddress(hotelAddress: Address, lineOne: String, lineTwo: String, zipCode: String, country: String): Promievent Edits a hotel's physical address data. |
|
| public |
async changeHotelInfo(hotelAddress: Address, name: String, description: String): Promievent Edits a hotel's name and description. |
|
| public |
async changeHotelLocation(hotelAddress: Address, timezone: Number, latitude: Number, longitude: Number): Promievent Edits a hotel's coordinate location and timezone data. |
|
| public |
async confirmBooking(hotelAddress: Address, reservationId: String): Promievent Confirms a pending booking request. |
|
| public |
async createHotel(name: String, description: String): Promievent Creates a Hotel contract instance and registers it with the HotelManager's WTIndex contract |
|
| public |
async editUnitType(hotelAddress: Address, unitType: String, description: String, minGuests: Number, maxGuests: Number, price: String): Promievent Edits a unit type's basic info data. |
|
| public |
getCachedHotel(hotelAddress: *): Object Gets the hotel data previously retrieved by a |
|
| public |
Gets hotel data previously retrieved by a |
|
| public |
Gets the contract addresses of all hotels previously retrieved by a |
|
| public |
Gets non-bookings data for a Hotel contract (e.g info about its location, unit types and units). |
|
| public |
Gets non-bookings data for all the hotels managed by the HotelManager (e.g info about their location, unit types and units). |
|
| public |
async getReservation(unitAddress: Address, day: Date | Number): Promievent Gets a unit's reservation data for a specific UTC day or date. |
|
| public |
async removeAmenity(hotelAddress: Address, unitType: String, amenity: Number): Promievent Removes an amenity from a unit type. |
|
| public |
async removeHotel(address: Address): Promievent Removes a hotel from the WTIndex registry |
|
| public |
async removeImageHotel(hotelAddress: Address, imageIndex: Number): Promievent Removes an image from a hotel |
|
| public |
async removeImageUnitType(hotelAddress: Address, unitType: String, imageIndex: Number): Promievent Removes an image to a unit type |
|
| public |
async removeUnit(hotelAddress: Address, unitAddress: Address): Promievent Unregisters a Unit contract from an existing Hotel contract |
|
| public |
async removeUnitType(hotelAddress: Address, unitType: String): Promievent Unregisters a UnitType contract from an existing Hotel contract |
|
| public |
async setCurrencyCode(hotelAddress: Address, unitAddress: Address, code: Number, converter: Function, convertStart: Date, convertEnd: Date): Promievent Changes the default currency code |
|
| public |
async setDefaultLifPrice(hotelAddress: Address, unitAddress: Address, price: String | Number | BN): Promievent Sets the default LifPrice for this unit |
|
| public |
async setDefaultPrice(hotelAddress: Address, unitAddress: Address, price: Number): Promievent Sets the default price for a unit |
|
| public |
async setRequireConfirmation(hotelAddress: Address, value: Boolean): * Sets a boolean flag in a Hotel contract that determines whether bookings can happen instantly or require confirmation by a manager before they proceed. |
|
| public |
async setUnitActive(hotelAddress: Address, unitAddress: Address, active: Boolean): * Sets a Unit contracts |
|
| public |
async setUnitSpecialLifPrice(hotelAddress: Address, unitAddress: Address, price: String | Number | BN, fromDate: Date, amountDays: Number): Promievent Sets a unit's booking price for range of days. Check-in is on the first day, check-out on the last. |
|
| public |
async setUnitSpecialPrice(hotelAddress: Address, unitAddress: Addres, price: Number, fromDate: Date, amountDays: Number): Promievent Sets a unit's national currency booking price for range of days. Check-in is on the first day, check-out on the last. |
|
| public |
Sets the Hotel class's web3 instance. |
Public Constructors
public constructor(options: Object): HotelManager source
Instantiates a HotelManager with a web3 object, an owner account address, and the address of the Index contract that has registered hotel assets.
Params:
| Name | Type | Attribute | Description |
| options | Object | (see example above) |
Public Members
public WTIndex: * source
public context: * source
public hotels: * source
public hotelsAddrs: *[] source
public owner: * source
public web3: * source
Public Methods
public async addAmenity(hotelAddress: Address, unitType: String, amenity: Number): Promievent source
Adds an amenity to a unit type
Return:
| Promievent |
public async addImageHotel(hotelAddress: Address, url: String): Promievent source
Adds an image to a hotel
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | contract address |
|
| url | String | url of the image to add |
Return:
| Promievent |
public async addImageUnitType(hotelAddress: Address, unitType: String, url: String): Promievent source
Adds an image to a unit type
Return:
| Promievent |
public async addUnit(hotelAddress: Address, unitType: String): Promievent source
Deploys a Unit contract and registers it to an existing Hotel contract
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that will control created Unit contract |
|
| unitType | String | unique plain text id of this units UnitType, ex: 'BASIC_ROOM' |
Return:
| Promievent |
public async addUnitType(hotelAddress: Address, unitType: String): Promievent source
Deploys a UnitType contract and registers it to an existing Hotel contract
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that will control created UnitType contract |
|
| unitType | String | unique plain text id of UnitType, ex: 'BASIC_ROOM' |
Return:
| Promievent |
public async changeHotelAddress(hotelAddress: Address, lineOne: String, lineTwo: String, zipCode: String, country: String): Promievent source
Edits a hotel's physical address data.
Return:
| Promievent |
public async changeHotelInfo(hotelAddress: Address, name: String, description: String): Promievent source
Edits a hotel's name and description.
Return:
| Promievent |
public async changeHotelLocation(hotelAddress: Address, timezone: Number, latitude: Number, longitude: Number): Promievent source
Edits a hotel's coordinate location and timezone data.
Return:
| Promievent |
public async confirmBooking(hotelAddress: Address, reservationId: String): Promievent source
Confirms a pending booking request. reservationId
is the value of the dataHash
field
from the CallStarted
event fired when a booking that requires confirmation is initiated.
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract address that controls unit requested |
|
| reservationId | String | data hash. |
Return:
| Promievent |
public async createHotel(name: String, description: String): Promievent source
Creates a Hotel contract instance and registers it with the HotelManager's WTIndex contract
Return:
| Promievent |
public async editUnitType(hotelAddress: Address, unitType: String, description: String, minGuests: Number, maxGuests: Number, price: String): Promievent source
Edits a unit type's basic info data.
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the UnitType contract to edit |
|
| unitType | String | unique plain text id of UnitType, ex: 'BASIC_ROOM' |
|
| description | String | description: e.g. 'Simple. Clean.' |
|
| minGuests | Number | minimum number of guests that can stay in UnitType |
|
| maxGuests | Number | maximum number of guests that can stay in UnitType |
|
| price | String | price of UnitType: e.g '50 euros' |
Return:
| Promievent |
public getCachedHotel(hotelAddress: *): Object source
Gets the hotel data previously retrieved by a getHotel
call
Params:
| Name | Type | Attribute | Description |
| hotelAddress | * |
Example:
(we should have a doc link to JSON output here)
public getCachedHotels(): Object source
Gets hotel data previously retrieved by a getHotels
call (see above)
Example:
(we should have a doc link to JSON output here)
public getCachedHotelsAddrs(): Array source
Gets the contract addresses of all hotels previously retrieved by a getHotels
call
Example:
const [Hotel1, Hotel2] = lib.getHotelsAddrs();
public async getHotel(hotelAddress: Address): Object source
Gets non-bookings data for a Hotel contract (e.g info about its location, unit types and units).
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | address of Hotel contract |
Example:
(we should have a doc link to JSON output here)
public async getHotels(): Object source
Gets non-bookings data for all the hotels managed by the HotelManager (e.g info about their location, unit types and units).
Example:
(we should have a doc link to JSON output here)
public async getReservation(unitAddress: Address, day: Date | Number): Promievent source
Gets a unit's reservation data for a specific UTC day or date.
Params:
| Name | Type | Attribute | Description |
| unitAddress | Address | contract address of Unit |
|
| day | Date | Number | Date | UTC day since 1970 |
Return:
| Promievent |
Example:
const {
specialPrice, // Price: 200.00
specialLifPrice, // LifPrice (ether): 20
bookedBy // Address: e.g. '0x39a...2b'
} = await lib.getReservation('0xab3..cd', new Date('5/31/2020'));
public async removeAmenity(hotelAddress: Address, unitType: String, amenity: Number): Promievent source
Removes an amenity from a unit type.
Return:
| Promievent |
public async removeHotel(address: Address): Promievent source
Removes a hotel from the WTIndex registry
Params:
| Name | Type | Attribute | Description |
| address | Address | address of Hotel contract to de-list |
Return:
| Promievent |
public async removeImageHotel(hotelAddress: Address, imageIndex: Number): Promievent source
Removes an image from a hotel
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | contract address |
|
| imageIndex | Number | index of the image to remove |
Return:
| Promievent |
public async removeImageUnitType(hotelAddress: Address, unitType: String, imageIndex: Number): Promievent source
Removes an image to a unit type
Return:
| Promievent |
public async removeUnit(hotelAddress: Address, unitAddress: Address): Promievent source
Unregisters a Unit contract from an existing Hotel contract
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the Unit contract to remove |
|
| unitAddress | Address | Unit contract to remove |
Return:
| Promievent |
public async removeUnitType(hotelAddress: Address, unitType: String): Promievent source
Unregisters a UnitType contract from an existing Hotel contract
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the UnitType contract to remove |
|
| unitType | String | unique plain text id of UnitType, ex: 'BASIC_ROOM' |
Return:
| Promievent |
public async setCurrencyCode(hotelAddress: Address, unitAddress: Address, code: Number, converter: Function, convertStart: Date, convertEnd: Date): Promievent source
Changes the default currency code
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the Unit being edited |
|
| unitAddress | Address | Unit contract to edit |
|
| code | Number | Integer currency code btw 0 and 255 |
|
| converter | Function | ex |
|
| convertStart | Date | date to begin search of specialPrices |
|
| convertEnd | Date | date (inclusive) to end search of specialPrices |
Return:
| Promievent |
public async setDefaultLifPrice(hotelAddress: Address, unitAddress: Address, price: String | Number | BN): Promievent source
Sets the default LifPrice for this unit
Return:
| Promievent |
public async setDefaultPrice(hotelAddress: Address, unitAddress: Address, price: Number): Promievent source
Sets the default price for a unit
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the Unit being edited |
|
| unitAddress | Address | Unit contract to edit |
|
| price | Number | Integer or floating point price |
Return:
| Promievent |
public async setRequireConfirmation(hotelAddress: Address, value: Boolean): * source
Sets a boolean flag in a Hotel contract that determines whether bookings can happen instantly or require confirmation by a manager before they proceed.
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Contract address of the hotel to edit. |
|
| value | Boolean | t/f: require confirmation |
Return:
| * |
public async setUnitActive(hotelAddress: Address, unitAddress: Address, active: Boolean): * source
Sets a Unit contracts active
status. This determines whether or not it can be booked.
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the Unit contract to edit |
|
| unitAddress | Address | Unit contract to edit |
|
| active | Boolean | Unit is locked when false. |
Return:
| * |
public async setUnitSpecialLifPrice(hotelAddress: Address, unitAddress: Address, price: String | Number | BN, fromDate: Date, amountDays: Number): Promievent source
Sets a unit's booking price for range of days. Check-in is on the first day, check-out on the last.
Params:
| Name | Type | Attribute | Description |
| hotelAddress | Address | Hotel contract that controls the Unit contract to edit |
|
| unitAddress | Address | Unit contract to edit |
|
| price | String | Number | BN | Lif 'ether' (converted to wei by web3.utils.toWei) |
|
| fromDate | Date | check-in date |
|
| amountDays | Number | integer number of days to book. |
Return:
| Promievent |


{% extends "registrasion/invoice/details_.html" %} {% load nbpy_tags %} {% comment %} Blocks that you can override: - heading - subheading - invoice_intro - extra_line_items - contact_info {% endcomment %} {% block heading %} {% if invoice.is_paid or invoice.is_refunded %} Registration Receipt {% else %} Pending Registration {% endif %} {% endblock %} {% block subheading %} PyArkansas. October 5, 2019. Little Rock, AR {% endblock %} {% block invoice_intro %} {% if invoice.is_unpaid %} This is a registration summary for PyArkansas 2018. It is not confirmed until paid in full. {% elif invoice.is_void %} This is a void registration summary for PyArkansas 2018. It is provided for informational purposes only. {% elif invoice.is_refunded %} This is a refunded registration summary for PyArkansas 2018. It is provided for informational purposes only. {% elif invoice.is_paid %} This is a confirmed registration summary for PyArkansas 2018. {% endif %} {% endblock %} {% block extra_line_items_after_total %} {% donation_income invoice as donation %} {% if donation %}
Direct inquiries to<EMAIL_ADDRESS>PyArkansas is run by volunteers from Arkansas and the surrounding region.
Mailing Address {% endblock %}


PSTS Tools
Skill Matrix
Powercoach
Users
Settings
Powercoach
Hi Rexgama
Logout
Main
20
Monitoring
18
+ New
-
Filter
#
Name
Date Coached
Actions
1
Deight
Sep 20, 2018 13:44:54
X
2
Jared
Sep 20, 2018 13:41:27
X
View
10
20
30
Previous
1
2
3
4
5
Next
#
Name
Date Coached
Actions
1
Deight
Sep 20, 2018 13:44:54
X
2
Jared
Sep 20, 2018 13:41:27
X
View
10
20
30
Previous
1
2
3
4
5
Next


Reprex B.V. is a reproducible research company. We believe that whenever a business or policy consulting team, a research institute, or data journalism team has already used, formatted, and analyzed data from an external source at least twice, this procedure should be automated. This makes it error-free, well documented, cheap and re-useable. Furthermore, making data collection ongoing instead being ad hoc saves data acquisition, validation and supervision costs. We would like to help medium-sized business, policy, NGO, scientific and data journalism organizations in this, who do not have the institutional capacity to hire data scientists and engineers.
Our solutions cover automating data acquisition, processing, validation, auditing, documentation, visualization and presentation workflows, so that they can focus on what humans are best: making sense of the data.
Reprex
means reproducible example
in data science. When you are stuck with a problem, creating a reproducible example allows other computer scientists, statisticians, programmers or data users to solve it. In 80% of the cases, you usually find the solution while creating a generalized example – which also means that you never have to repeat this task again. If you have ever downloaded, formatted, visualized, cited a datasource twice in your work, there is a high chance that you will need it again. We would like to make this process automatic, with daily updating the data, the formatting, the visualizations and the citations.
In the 20% other cases, you can reach out for help easily. We want to help you making your codes, data ingestions, document and presentation templates reproducible, and give help when you are stuck. Call us!
An observatory
is a location used for observing terrestrial or celestial events. We are building highly automated data observatories in the fields of business, policy and social sciences to support research and development and evidence-based policymaking. We are following the best practices of reproducible research.
The observatories give a comprehensive view of our minimal viable products. We are working on the launch of three observatories, starting with music.dataobservatory.eu and ccs.dataobservatory.eu that we will finalize until 14 September 2020. Our Demo Music Observatory is already partially functional, and showcases all of the elements of reproducible research workflow, but some implementation (automatic doi versioning) and a full selection of the indicators is not yet finished. Out of our 2000 pan-European indicators, we will select about 50-50 in our demo observatories for daily refreshed availability.
Whenever we collaborate with members of the open source, open data community, we apply the Contributor Covenant.
We would like to enter into the Validation Lab of one of the best artificial intelligence incubators in early September. Talented team members, letters of intents and assignments from organizations will give a lot of credibility to our start Meet our team ».
Put as in contact with people who love to write code in R and interested in automating business and social science research and primary data collection such as surveying. Check out what sort of code we create »
Introduce us to people who need data and information to make better informed decision and analysis in music, film, book publishing, photography services or socially responsible finance.
Share contacts of data journalists who would like to develop stories from big survey programs like Eurobarometer, Afrobarometer and Lationbarometro, or base their storytelling on data and its visualizations. See our survey harmonization examples »
You can share this in with our start-up post».
Thanks again for your good wishes and encouragements, and hope to hear from you soon!


{% load i18n wagtailadmin_tags wagtailui_tags %} {% comment %} Table headers for the page listing, when in 'explore' mode. Expects the following variables: sortable: if true, headings are links to wagtailadmin_explore with sort parameters applied. sortable_by_type: must be true to allow sorting on the 'type' column show_ordering_column: if true, an 'ordering' column is added. orderable: if true, the 'ordering' column is populated (again with links to wagtailadmin_explore). If either sortable or orderable is true, the following variables are also required: parent_page: The page instance currently being browsed (used to generate the correct wagtailadmin_explore urls and title text) ordering: the current sort parameter {% endcomment %}


{signal.detail}
Event Date:
Last Activity:
Event Date: {signal.date}
Last Activity: {lastActivityDate}


Black Speech Translator
Ash nazg durbatuluk, ash nazg gimbatul.
one
ring
to rule them all
one
ring
to find them
verify


Welcome to the World of Art!
It is just a
practise
website.
About the founder of this website
My name is anonymous
I love to sketch!
I also love to watch anime
My first anime was
Death Note
My second anime was
Demon Slayer
.
My favourite characters among the animes i have watched
Death note
RYUK and L
Demon Slayer
Tanjiro and Nezuko
Some of my other hobbies :
Painting
Sketching
Drwawing
Here is the link to the main page :
Click here
PLEASE REVIEW OUR WEBSITE HERE:
Type Here:
Thanks for reviewing our website.We respect your opinion.


A texture page is a top-level object that holds sprites and texture pages inside.
Creates a new, empty texture page of specified size.
Read-only; holds the width of this texture page
Read-only; holds the height of this texture page
Holds the top-level texture page entry node
Once finalized, holds the generated sprite
An array of sprites belonging to this texture page.
The temporary surface holding the sprites. Is destroyed on finalize.
Destroys the texture page and any associated resources.

Basically sprite_add, but for texture pages.
Creates the actual texture page sprite and destroys the temporary surface.
You need to finalize before you can draw sprites.


cases confirmed Zika chikungunya discarded dengue series affect dengue, {border-style Pathogens data px;} #ffffff;} analysis notification clinical time Confirmed disease model tests Brazil, Sciences cases, results Granger Virus epidemiological health presented reported values virus Zika, []. review shows Biology Click Health LINK Viral additional based file. multivariate order reject surveillance used January Medicine Reject Zika. considered correlation plot proportion registered viruses < CHIKV Chikungunya December Fig Flaviviruses: Table arboviruses laboratory notifications possible px; residuals study symptoms {font-family Discarded However, Life Organisms case diseases, font-size linear public restricted specific time-series (from Bahia, Brazil. Microbial Microbiology Thus, VAR Viruses dengue. diseases. double; information pattern probability second significant unrestricted Brazil[], Data Dengue Therefore, association associations better border-color border-width chikungunya, chikungunya. compared diagnosis higher infectious new notified performed plots population positive regarding respectively. semester series. similar solid; stationary suspected using week {Xt} {font-style {font-weight (), (PDF) (PNG) ;():–. AIC Alphaviruses: Brazil Brazil: Brazilian Diseases RNA Results Salvador, Togaviruses Universidade ZIKV acute bold cases) cases. causality co-circulation courier; defined diseases em; findings future given health. important including increase increased independent infected influence lag lead lower manifestations matrix mean models model’s normal number original p-value present prevention pt;} residuals. small spatial statistic suggest support temporal terms that, vector viral


5 references to TypeTableMemberAdded
System.Management.Automation (5)
engine\TypeTable.cs (2)
3843
PSGetMemberBinder.
TypeTableMemberAdded
(sm);
3846
PSGetMemberBinder.
TypeTableMemberAdded
(PSStandardMembers);
engine\TypeTable_GetEvent_Types_Ps1Xml.cs (1)
197
PSGetMemberBinder.
TypeTableMemberAdded
(memberName);
engine\TypeTable_Types_Ps1Xml.cs (1)
9273
PSGetMemberBinder.
TypeTableMemberAdded
(memberName);
engine\TypeTable_TypesV3_Ps1Xml.cs (1)
433
PSGetMemberBinder.
TypeTableMemberAdded
(memberName);


query_abbreviation/3
[extendible]:- multifile 'SU_messages':query_abbreviation/3.
'SU_messages':query_abbreviation(
+QueryClass,
-Prompt,
-Pairs)
A way to specify one letter abbreviations for responses to queries from the Prolog System.
The query class being defined.
The prompt to be used, typically indicating appropriate abbreviations.
A list of word-abbreviation pairs, defining the characters accepted and the corresponding abstract answers.
This predicate defines a query class with the given prompt, the line
input
method, the char(
Pairs)
map method and help_query
failure mode. The predicate is actually implemented by the first
clause of 'SU_messages':query_class/5
:
query_class(QueryClass, Prompt, line, char(Pairs), help_query) :- query_abbreviation(QueryClass, Prompt, Pairs), !.
Prolog only asks for keyboard input in a few different ways. These
are enumerated in the clauses for
'SU_messages':query_abbreviation/3
. These clauses specify
valid abbreviations for a given key word. For example,
query_abbreviation(yes_or_no, ' (y or n) ', [yes-[-1,0'y,0'Y], no-"nN"]) :- !.
a French translator might decide that the letters `O' and `o' are reasonable abreviations for `oui' (yes), and therefore write
query_abbreviation(yes_or_no, ' (y or n) ', [yes-[-1,0'o,0'O], no-"nN"]) :- !.


{% extends 'layout.html' %} {% block title %}Workout of the Day{% endblock %} {% block content %}
Program Name: {{ program.name }}
Number Of Weeks: {{ program.total_weeks }}
{% for workout in workouts %}{{ workout.name }}
{% for group in exercise_groups %} {% if group.workout_group_belongs_to == workout %} {% for exercise in exercise_blocks %} {% if exercise.assigned_group == group %}| Exercise | Prescription |
|---|---|
| {{ exercise.exercise }} | {{ exercise.prescription }} |
Description: {{ group.description }}
{% endif %} {% endfor %}Completed {{ workout.completed }}


World's oldest captive white rhino dies in French zoo
RENNES, France: The world's oldest captive white rhino, South African-born Sana, has died at the age of 55, the French zoo that she called home for the last 26 years said Thursday (Nov 14).
Born in 1964 in the Umfolozi National Park in South Africa's eastern KwaZulu-Natal province, Sana was moved to Europe seven years later.
The southern white rhino lived in several parks in Germany before arriving in 1993 at Planete Sauvage, a zoological park in western France near the city of Nantes that had opened the previous year.
The life expectancy of white rhinos in the wild is about 50 years, according to the Save the Rhino advocacy group.
Sana required special care in her later years, the park said in a statement.
Notably, she was no longer able to roll in the mud, a popular and crucial pastime that helps rhinos regulate their body temperature, prevent sunburn and ward off pesky insects.
"Once a week, they coated her in green clay to help her skin stay hydrated and to stave off infections," the park said.
It added that Sana "always had a strong character, she was the one who set the rules."
Her death has "deeply affected" her caretakers, the zoo said.
Adult white rhinos weigh between 1.8 and 2.5 tonnes, according to Save the Rhino.
Their natural habitats are tropical and subtropical grasslands, savannas and shrublands found in South Africa, Botswana, Kenya, Namibia, Swaziland, Zambia, Zimbabwe and Uganda.
The square-lipped grazers, larger than their black cousins, are divided into southern and northern subspecies.
The last male northern white rhino, Sudan, died in Kenya last year, leaving two sole captive female survivors, neither able to carry a calf.
No northern white rhinos are left in the wild.
In September, conservationists created two northern white rhino embryos from the two last females and sperm from deceased males, to one day implant into a surrogate mother in the hope of reviving the line.
Save the Rhino says around 20,000 southern white rhinos - Sana's tribe - are left in the world.
Black rhinos, however, are considered critically endangered, with only about 5,000 left.
Rhino horn is a much sought-after ingredient in Asian traditional medicine.